Filter过滤器
Filter即为过滤器,用于Servlet之外对request或者对response进行修改。它主要用于对用户请求进行预处理,也可以对HttpServletResponse进行后处理。在一个web应用中可以编写多个Filter,这些Filter组合起来称为一个Filter链。
若是一个过滤器链:先配置先执行(请求时的执行顺序);响应时:以相反的顺序执行。
过滤器的实现
通过继承Filter的接口实现一个过滤器,Filter的实现只需要两步:
1、编写java类实现Filter接口,并实现其doFilter方法
2、在web.xml文件中对编写的Filter类进行注册,并设置它所能拦截的资源。
<filter>
<filter-name>Filter01</filter-name> <!-- 给服务器看的名称,与filter-mapping中的filter-name保持一致,不能有重复的 -->
<filter-class>com.shsxt.filter.Filter01</filter-class> <!-- 过滤器类的路径 -->
</filter>
<filter-mapping>
<filter-name>Filter01</filter-name> <!-- 给服务器看的名称,与filter中的filter-name保持一致->
<url-pattern>/s01</url-pattern> <!-- 要拦截的资源路径 -->
<servlet-name>Servlet01</servlet-name> <!-- 要拦截的servlet的servlet-name的值 -->
</filter-mapping>
注意:在放行资源之前处理request请求,响应会在放行之后执行。
过滤器链:如果有多个过滤器,拦截顺序为web.xml中的配置顺序,谁先配置谁先执行,放行是如果有下一个顾虑器,会自动放行到下一个过滤器,如果没有则放行到指定的资源。
字符集过滤器
处理前台传递过来的中文数据给后台,出现乱码问题,常见的乱码问题是,任何版本的post请求都是乱码,可以用request.setCharacterEncoding(“UTF-8”);处理,对于get请求,tomcat8及以上不会出现乱码,因此不用处理,但是如果是tomcat7及以下会出现乱码,上面那种方法不顶用,可以使用new String(request.getParameter(name).getBytes(“ISO-8859-1”),“UTF-8”);但是只有一个字段一个字段处理,因此我们可以重写getparameter()方法,让乱码问题在顾虑器就被解决。
步骤:
1)、定义内部类,继承HhttpServletRequestWapper包装类
2)、重写HttpServletRequestWrapper的父类ServletRequestWrapper中的getParameter()方法
注:自定义的MyWapper类继承了HttpServletRequest接口,所以MyWapper类的本质就是request。
class MyWapper extends HttpServletRequestWrapper {
// 定义HttpServletRequest对象,用来提升带参构造器中的request
private HttpServletRequest request;
public MyWapper(HttpServletRequest request) {
super(request);
this.request = request; // 提升作用域
}
/**
* 处理乱码
*/
@Override
public String getParameter(String name) {
// 得到请求的参数值
String value = request.getParameter(name);
try {
// 判断参数不为空,则做乱码处理
if (value != null && !"".equals(value)) {
// 处理乱码问题
value = new String(value.getBytes("ISO-8859-1"),"UTF-8");
}
} catch (Exception e) {
e.printStackTrace();
}
return value;
}
}
非法访问拦截
默认拦截所有资源
什么情况需要拦截:
- 用户访问一些需要登录成功之后才能访问的资源
什么时候才放行:
- 1、指定页面,放行(无需登录即可访问的页面,比如登录页面、注册页面等)
- 2、指定资源,放行(静态资源,放行;存放在statics目录下的资源放行)
- 3、指定操作,放行(无需用户登录即可执行的操作,放行;比如登录曹组、注册操作等)
- 4、登录状态,放行(session作用域中是否存在指定对象)
如果以上情况都不满足,则拦截跳转到登录页面
监听器
监听器有三类 8 种:
⑴监听生命周期:实现接口 ServletRequestListener、HttpSessionListener 、 ServletContextListener
⑵监听值的变化:实现接口ServletRequestAttributeListener、HttpSessionAttributeListener、ServletContextAttributeListener
⑶针对 session 中的对象:监听 session 中的 java 对象(javaBean) 是 javaBean 直接实现监听器 的接口。
监听的具体实现
1、创建一个监听器,需要实现某种接口,根据需求选取 HttpSessionListener
2、在 web.xml 中配置该监听器创建一个类,并实现 HttpSessionListener 接口,用来检测 Session 的创建和销毁。 在类中定义一个成员变量用来存储当前的 session 个数。
<listener>
<listener-class>com.shsxt.web.OnLineListen</listener-class>
</listener>
Servlet3.0注解
@WebServlet
配置Servlet访问路径
//四中写法均可
@WebServlet(name="Servlet01",value="/s01")
@WebServlet(name="Servlet01",value={"s01","s001"})
@WebServlet(name="Servlet01",urlPatterns="/s01")
@WebServlet(name="Servlet01",urlPatterns={"s01","s001"})
@WebFilter
配置Filter过滤器
@webFilter(filterName="TestFilter",urlPatterns="/*")
使用注解时:过滤器链按照类名的字母排序(大部分情况)
@MultipartConfig
使用注解@MultipartConfig 将一个 Servlet 标识为支持文件上传。
Servlet3.0 将 multipart/form-data 的 POST 请求封装成 Part,通过 Part 对上传的文件进行操作。
-
1、普通表单项取值
request.getParameter(name)
-
2、文件域
request.getPart(name);
-
注:如果前台表单是文件上传表单,一定你要加上注解@MultipartConfig