发表于: 2017-12-07 19:30:41
1 772
今日完成:
自己学了下拦截器、过滤器和监听器。
明日计划:
写出复盘方案。
成果:
三个都是继承各自的接口然后再配置文件中引用一下就可以了。
拦截器:
这次的拦截器我是判断数据库中是否存在此用户(判断返回值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不可替换。
因为我本来是想要把过滤器中的粗口改为****的,但是不能实现,所以只能重定向代替了。
进度:
明日制定方案。
评论