SpringMVC框架3
1.使用过滤器进行中文乱码的解决
[1]方式一:自己配置字符编码过滤器
A、配置web.xml文件
<!--配置字符编码过滤器-->
<filter>
<filter-name>enc</filter-name>
<filter-class>cn.qt.filter.EncFilter</filter-class>
<init-param>
<param-name>encoding</param-name>
<param-value>utf-8</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>enc</filter-name>
<!-- url范围:表示所有以servlet/开头的请求 具体范围根据项目情况编写 -->
<url-pattern>/servlet/*</url-pattern>
</filter-mapping>
B、字符编码过滤器文件
package cn.qt.filter;
import javax.servlet.*;
import java.io.IOException;
public class EncFilter implements Filter {
String enc;
@Override
public void init(FilterConfig filterConfig) throws ServletException {
enc = filterConfig.getInitParameter("encoding");
}
@Override
public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws IOException, ServletException {
//1.到达目标资源之前的预处理
req.setCharacterEncoding(enc);
resp.setContentType("text/html;charset=utf8");
//2.执行目标资源方式或者下一个过滤器
chain.doFilter(req,resp);
//3.离开服务器之前的处理操作
}
@Override
public void destroy() {
}
}
[2]方式二:spring中的字符编码过滤器
在web.xml中配置
<!--spring中配置字符编码过滤器-->
<filter>
<filter-name>enc</filter-name>
<filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
<init-param>
<param-name>encoding</param-name>
<param-value>utf-8</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>enc</filter-name>
<!-- url范围:表示所有以servlet/开头的请求 具体范围根据项目情况编写 -->
<url-pattern>/servlet/*</url-pattern>
</filter-mapping>
2.springMVC中的拦截器
[1]springmvc中的拦截器和过滤器的区别
拦截器可以看作是一个细化了的过滤器,拦截器主要针对的是控制单元,而过滤器主要针对的是每一个请求
具体如图
[2]springmvc中的拦截器的代码实现
A、拦截器类
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class MyIncer implements HandlerInterceptor {
/*
* 执行时机:在进入控制单元之前执行
*
* 这个方法的返回值为true 则继续执行后续的方法
* 这个方法的返回值为false 则停止执行后续的方法
* O---即将执行控制单元中方法的对象
* */
@Override
public boolean preHandle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o) throws Exception {
System.out.println("preHandle");
return true;
}
/*
* 执行时机:在数据处理之后执行该方法
* o:控制单元方法
* modelAndView:视图模型对象
* */
@Override
public void postHandle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, ModelAndView modelAndView) throws Exception {
System.out.println("postHandle");
}
/*
* 执行时机:在进行页面渲染的时候执行
* */
@Override
public void afterCompletion(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, Exception e) throws Exception {
System.out.println("afterCompletion");
}
}
B、springmvc配置文件中配置拦截器
<!--配置拦截器-织入切面 -->
<mvc:interceptors>
<mvc:interceptor>
<mvc:mapping path="/userlogin"/><!--login请求添加拦截器-->
<bean class="cn.qt.interceptor.MyIncer"></bean>
</mvc:interceptor>
</mvc:interceptors>
C、拦截器中各个方法的执行时机如下图所示
[3]拦截器中各个方法的作用
A、preHandle
作用一:进行中文乱码的处理
//作用一:进行中文乱码的处理
req.setCharacterEncoding("utf-8");
作用二:进行页面的拦截,如某功能正在维护,用户点击跳到指定页面
@Override
public boolean preHandle(HttpServletRequest req, HttpServletResponse resp, Object o) throws Exception {
//作用二:进行页面的拦截
req.getRequestDispatcher("/WEB-INF/wh.jsp").forward(req,resp);
System.out.println("preHandle"+o);
return false;
}
B、postHandle
作用一:用于控制单元中模块的测试
//作用一:用于控制单元中模块的测试
modelAndView.setViewName("前端页面路径");
在postHandle方法中使用该语句后,拦截器在做完数据处理后会跳到指定路径的页面,而不是原项目中的路径
作用二:恶意字符替换,比如直播、游戏等聊天屏蔽恶意字符用***替代
@RequestMapping("userlogin")
public String login(User user, HttpServletRequest req, Map<String,String> map){
User login = users.login(user.getUname(), user.getPwd());
if (login!=null){
req.getSession().setAttribute("us",login);
return "forward:/toMain";
}else {
//request底层使用的是map集合,因此可以用map代替setAttribute()
map.put("msg","登录错误枪支");
//req.setAttribute("msg","用户名或密码错误");
return "login";
}
}
我们登陆失败后的提示,“登录错误枪支"改为"登录失败**”。
@Override
public void postHandle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, ModelAndView modelAndView) throws Exception {
//作用二:恶意字符替换
Map<String, Object> map = modelAndView.getModel();
String msg = (String)map.get("msg");
if (msg.contains("枪支")){
//把枪支替换为**
String all = msg.replaceAll("枪支", "**");
map.put("msg",all);
}
}