服务器会把客户端的请求数据封装到request对象中,request就是请求数据的载体
1.通过User-Agent识别用户浏览器版本
public class AServlet extends HttpServlet {
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
String userAgent = req.getHeader("User-Agent");
System.out.println(userAgent);
if(userAgent.toLowerCase().contains("chrome")){
System.out.println("你使用的是谷歌!");
}else if(userAgent.toLowerCase().contains("firefox")){
System.out.println("你使用的是火狐!");
}
}
}
2.防盗链,如果请求不是通过本站的超链接发出来的,则发送错误码404
使用referer头判断:
如果来源为自己网站发出的超链接,则跳转到相应的地址,否则发出相应错误,这个实例中添加了一个a.html页面
Insert title here
请求头案例
public class AServlet extends HttpServlet {
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
String referer = req.getHeader("Referer");
System.out.println(referer);
if(referer == null || !referer.contains("localhost")){
resp.sendError(404,"不让你看!");
}else{
System.out.println("hello");
}
}
}
例子:http://localhost:8080/temp/AServlet?username=xxx&password=123
String getParameter(String name),获取指定名称的请求参数值,适用于单值请求参数
Map
String[] getParameterValues(String name),获取指定名称的请求参数值,适用于多值请求参数
获取请求参数实例,表单POST(基本注册)+ a标签GET
html页面
Insert title here
提交
JAVA代码
public class AServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println(req.getParameter("username1"));
System.out.println(req.getParameter("password1"));
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// TODO 自动生成的方法存根
String username = req.getParameter("username");
String password = req.getParameter("password");
String[] hobbys = req.getParameterValues("hobby");
System.out.println(username);
System.out.println(password);
System.out.println(Arrays.toString(hobbys));
}
}
有时一个请求需要多个Servlet协作才能完成,所以需要在一个Servlet中跳到另一个Servlet
一个请求跨多个Servlet,需要使用转发和包含。
实例:
public class AServlet extends HttpServlet {
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("AServlet");
resp.getWriter().print("Hello AServlet");
RequestDispatcher rd = req.getRequestDispatcher("/BServlet");
rd.forward(req, resp);//请求转发
//rd.include(req, resp);//请求包含
}
}
public class BServlet extends HttpServlet {
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("BServlet");
resp.getWriter().print("Hello BServlet");
}
}
客户端首先要打开一个页面,然后在页面中提交表单或点击超链接,在请求这个页面时,服务器响应的编码是什么,那么客户端发送请求时的编码就是什么
服务器默认使用ISO-8859-1来解码,所以一定出现乱码,ISO不支持中文
解决办法:
只需要在获取参数之前调用request.setCharacterEncoding("utf-8")
适用于tomcat8以下的服务器,tomcat8不需要反编
String name = request.getParameter("name");
反编:
byte[] bytes = name.getBytes("ISO-8859-1");
name = new String(bytes,"utf-8");
实例:
Insert title here
提交
public class AServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
String name = req.getParameter("username1");
byte[] bytes = name.getBytes("iso-8859-1");
name = new String(bytes,"utf-8");
System.out.println(name);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
req.setCharacterEncoding("utf-8");
String name = req.getParameter("username");
System.out.println(name);
}
}