拦截器
- 拦截器一般是用来决定servlet要不要执行,怎末执行
- 拦截器是拦截请求并且在servlet之前执行动作逻辑的一种组件
- 其实拦截器就是看你有没有能力执行下一个逻辑单元。
- Filter在服务器一启动的时候就直接加载。
拦截器的常用方法:
1、初始化方法
public void init(FilterConfig filterConfig) throws ServletException {
filterConfig.getInitParameter(String s); //获取web.xml中的初始化信息
}
2、具体的拦截方法
/**这里的ServletRequest servletRequest和ServletResponse servletResponse其实就是
* HttpServletRequest和HttpServletResponse,只不过类型没有转换而已。
*/
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
HttpServletRequest request = (HttpServletRequest) servletRequest; //类型转换
HttpServletResponse response = (HttpServletResponse) servletResponse;
}
3、直接放过和不放过
filterChain.doFilter(request, response); //直接放过
response.sendRedirect("hello.html"); //不放过
这里不放过里面的是某一页面或servlet,例如登录页面
4、销毁方法
public void destroy() {
}
5、web.xml中的配置
<filter>
<filter-name>loginfilter</filter-name> //映射名
<filter-class>控制器.LoginFilter</filter-class> //拦截器具体实现的类
</filter>
<filter-mapping>
<filter-name>loginfilter</filter-name> //映射名
<url-pattern>*.do</url-pattern> //拦截所有.do的servlet。
</filter-mapping>
注意这里拦截器也会拦截html的,所以直接打*是会拦截所有页面的,如果具体想
拦截某一个servlet,就写上具体的映射名。
<url-pattern></url-pattern> //写上具体的映射名
这里可以看一个简单的配置,不在web.xml配置的方式。
@WebFilter("test.do") //注解式开发,拦截test.do
@WebInitParam(name = "username", value = "url") //设置初始化参数
文件上传
- 文件上传一般不会用异步请求发送,一般都是同步请求发送文件
- 文件上传,绝对不用Get请求发送,一定使用Post请求发送(如果用Get请求,你要将文件的字节流缀在URL后面,大一点的文件就被写死了,有限制,而且还贼长)
1、前端设置文件上传
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<!--enctype="multipart/form-data:改变编码格式,将file改成多媒体文件格式往外发-->
<form action="test.do" method="post" enctype="multipart/form-data">
文件:<input type="file" name="myfile">
<input type = text name="fileRename">
<input type = "submit">
</form>
</body>
</html>
这里注意:
enctype="multipart/form-data:改变编码格式,将file改成多媒体文件格式往外发,不然发的还是字符。
2、浏览器此时的状态
3、服务器接受文件,并写到指定路径下去
@WebServlet("/test.do")
@MultipartConfig
//证明该Servlet 可以接受文件
public class FileUplodeController extends HttpServlet {
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
req.setCharacterEncoding("utf-8");
//文件接收用Part接收
Part part = req.getPart("myfile");
//字符接收用getParameter()
String rename = req.getParameter("fileRename");
//在"E:/shiruntao/" 路径下,接收上传的文件
//part.getSubmittedFileName() 获取文件名
FileOutputStream fos = new FileOutputStream("E:/shiruntao/" + part.getSubmittedFileName());
InputStream is = part.getInputStream();
byte[] b = new byte[is.available()];
is.read(b);
fos.write(b);
//resp.getWriter().write("文件上传成功");
}
}
这里注意:
- @MultipartConfig一定要写上,证明该Servlet 可以接受文件。服务器接收文件之后都会存在Part中,所以用req.getPart( from表单中的key值) 、part.getSubmittedFileName() 获取上传的文件名,获得到对应的文件,然后用IO流写到指定文件中去。
- 将是上传的文件设置到项目发布的路径中
String s = req.getServletContext().getRealPath(""); //通过这个找到项目发布的真实路径
FileOutputStream fos = new FileOutputStream(s + "img/" + part.getSubmittedFileName()); //将文件写入项目发布的路径中
byte[] b = new byte[is.available()];
is.read(b);
fos.write(b);
执行结果:
这个动作一般应用于用户上传头像,我们要把用户信息保存在数据库中,而将一张图片保存在数据库中是不容易的,所以我们将图片的路径信息保存在数据库中就OK了。
文件下载
1、先从服务器中读出文件
FileInputStream is = new FileInputStream("E:/shiruntao/局域网.PNG");
byte[] b = new byte[is.available()];
is.read(b);
2、告诉浏览器上传的是一个文件
resp.setHeader("Content-Disposition", "attachment; filename=hhh.png"); //hhh.png:设置的下载后的名字
3、向浏览器写出文件
OutputStream os = resp.getOutputStream();
os.write(b);
OK,Servlet体系就告一段落了…