SpringMVC框架3(使用过滤器进行中文乱码的解决、SpringMVC中的拦截器)

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);
        }
    }

3.springmvc的总结

在这里插入图片描述

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值