发表于: 2017-12-07 19:30:41

1 771


今日完成:

自己学了下拦截器、过滤器和监听器。

明日计划:

写出复盘方案。

成果:

三个都是继承各自的接口然后再配置文件中引用一下就可以了。

拦截器:

这次的拦截器我是判断数据库中是否存在此用户(判断返回值List的大小),如果已经存在就重定向返回错误页面,不存在就正常。

需要继承HandlerInterceptor。

本次只使用了prehandel方法验证。

public class Interceptor implements HandlerInterceptor {
@Resource
   private Services services;
   public Interceptor() throws Exception {
}

@Override
   public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
throws Exception {
System.out.println(services.takeByname(request.getParameter("name"))+"取出来的人");
       if(services.takeByname(request.getParameter("name")).size()==0)
return true;
       else {
request.getSession().setAttribute("errorMessage","这个人已经在数据库了");
           System.out.println("当前位置"+request.getContextPath());
           response.sendRedirect(request.getContextPath()+"/peace");
           return false;
       }
}

@Override
   public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler,
                          ModelAndView modelAndView) throws Exception {
System.out.println("==========================================post3================================================");
   }

@Override
   public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex)
throws Exception {
System.out.println("==========================================after3================================================");
   }
}

spring配置文件的引用,path是接口标志,class就是引用生成bean定义为拦截器。

<mvc:interceptors>
   <mvc:interceptor>
       <mvc:mapping path="/user/success"/>
       <!-- 定义在mvc:interceptor下面的表示是对特定的请求才进行拦截的 -->
       <bean class="com.jnshu.interceptor.Interceptor"/>
   </mvc:interceptor>
</mvc:interceptors>

过滤器:

本次使用过滤器制作了个脏话过滤,输入的信息中存在脏话就返回错误页面。

public class PeaceFilter implements Filter {
public void destroy() {
}
public void doFilter(ServletRequest request, ServletResponse response, FilterChain filterChain) throws IOException, ServletException {
String parameterName = null;
       String parameterValue = null;
       String dirtyToString="";
       RequestDispatcher requestDispatcher;
       // 获取请求的参数
       @SuppressWarnings("unchecked")
Enumeration<String> allParameter = request.getParameterNames();
       while(allParameter.hasMoreElements()){
parameterName = allParameter.nextElement();
           parameterValue = request.getParameter(parameterName);
           if(null != parameterValue){
for(String str : invalidCharacter){
if (StringUtils.containsIgnoreCase(parameterValue, str)){
dirtyToString=dirtyToString+str+"  ";
                   }
}
}
}
if(dirtyToString.length()>1){
System.out.println("爆粗");
           System.out.println(dirtyToString);
           requestDispatcher = request.getRequestDispatcher("/peace");
           request.setAttribute("errorMessage", "非法字符:" + dirtyToString);
           requestDispatcher.forward(request, response);

       }
filterChain.doFilter(request, response); // 执行目标资源,放行
   }

public void init(FilterConfig filterConfig) throws ServletException {
System.out.println("过滤器就位");
   }
// 需要过滤的非法字符
   private static String[] invalidCharacter = new String[]{
"卖批","","吃屎","傻逼","妈的"
   };
}

在web.xml中添加以下就添加成功了。

<filter>
   <filter-name>SelfDefineInvalidCharacterFilter</filter-name>
   <filter-class>com.jnshu.filter.PeaceFilter</filter-class>
</filter>
<filter-mapping>
   <filter-name>SelfDefineInvalidCharacterFilter</filter-name>
   <url-pattern>/*</url-pattern>
</filter-mapping>

监听器:

继承HttpSessionListener,需要设置多久判定下线,不然不知道要等多久。

只要有用户进入项目页面就会调用sessionCreated,我只通过setMaxInactiveInterval来设定下线时间后会调用seesionDestroyed,如果不设置不知道如何判定下线。

public class OnlineListener implements HttpSessionListener {
public static int TOTAL_ONLINE_USERS = 0;
   public void sessionCreated(HttpSessionEvent httpSessionEvent) {
httpSessionEvent.getSession().setMaxInactiveInterval(10);
           TOTAL_ONLINE_USERS++;
           System.out.println("一位客户找到梦想在线人数"+TOTAL_ONLINE_USERS);

   }

public void sessionDestroyed(HttpSessionEvent httpSessionEvent) {

TOTAL_ONLINE_USERS--;
           System.out.println("一位客户失去梦想在线人数"+TOTAL_ONLINE_USERS);

   }
}

遇到的困难:

不知道如何在过滤器中改变request中的值,试过用setAttribute不可替换。

因为我本来是想要把过滤器中的粗口改为****的,但是不能实现,所以只能重定向代替了。

进度:

明日制定方案。



返回列表 返回列表
评论

    分享到