Filter过滤器的使用
以指定资源匹配。例如"/index.jsp"
以目录匹配。例如"/servlet/*"
以后缀名匹配,例如"*.jsp"
通配符,拦截所有web资源。"/*"
自动登录 未登录拦截到登录界面
Servlet界面
package com.zking.servlet;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class LoginServlet extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doPost(request, response);
}
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
request.setCharacterEncoding("utf-8");
response.setContentType("text/html;charset=utf-8");
String username = request.getParameter("username");
String password = request.getParameter("password");
String auto = request.getParameter("auto"); // 是否自动登录
if ("admin".equals(username) && "123".equals(password)) {// 如果登录成功
request.getSession().setAttribute("username", username);
if (auto == null) {// 未勾选自动登录
Cookie cookie = new Cookie("auto", null);
cookie.setMaxAge(60 * 60 * 24);// cookie有效时间
response.addCookie(cookie);
} else {// 勾选自动登录
Cookie cookie = new Cookie("auto", username + "_" + password);
cookie.setMaxAge(60 * 60 * 24);// cookie有效时间
response.addCookie(cookie);
}
// 登录成功,跳转
response.sendRedirect("index.jsp");
} else {
// 未登录成功,重新登录
response.sendRedirect("login.jsp");
}
}
}
监听器 Filter
package com.zking.servlet;
import java.io.IOException;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import com.zking.utils.CookieUtil;
public class LoginFilter implements Filter {
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
HttpServletRequest req = (HttpServletRequest) request;
HttpServletResponse resp = (HttpServletResponse) response;
if(req.getRequestURI().contains("login.jsp")) {//如果访问login,直接放行
chain.doFilter(req, resp);
return;
}else {
String username = (String) req.getSession().getAttribute("username");
if(username==null) {//sesion中没有,去Cookie中找
String val = CookieUtil.getCookieValByKey("auto", req);
if(val!= null&& !val.equals("")) {
String name = val.split("_")[0];
String pass = val.split("_")[1];
if("admin".equals(name) && "123".equals(pass)) {//重新验证登录
req.getSession().setAttribute("username", name);//登录成功,放入Session,并放行
chain.doFilter(req, resp);
return;
}else {//验证失败,重新登录
resp.sendRedirect("login.jsp");
}
}else {//Cookie中也没有,第一次访问,跳转登录页面
resp.sendRedirect("login.jsp");
}
}else {//session中有,放行
chain.doFilter(req, resp);
return;
}
}
}
@Override
public void destroy() {
// TODO Auto-generated method stub
}
@Override
public void init(FilterConfig arg0) throws ServletException {
// TODO Auto-generated method stub
}
}
xml中配置文件 要包裹在</web-app>中才有效
<servlet>
<servlet-name>LoginServlet</servlet-name>
<servlet-class>com.zking.servlet.LoginServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>LoginServlet</servlet-name>
<url-pattern>/login.do</url-pattern>
</servlet-mapping>
<filter>
<filter-name>LoginFilter</filter-name>
<filter-class>com.zking.servlet.LoginFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>LoginFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
注意 xml文件只有在创建web项目时点击下一步两次勾选后才会有
过滤器中三个方法的作用
package com.zking.filter;
import java.io.IOException;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
//该类要称为过滤器类 实现Filter接口 继承HttpFilter
public class FilterDemo implements Filter{
@Override
public void destroy() {
System.out.println("过滤器被销毁了~~~~~~");
}
@Override
public void doFilter(ServletRequest arg0, ServletResponse arg1, FilterChain arg2)
throws IOException, ServletException {
// 所设的关卡
System.out.println("来了老弟~~~放我过去!!!!!!!!!!");
System.out.println("放行 start");
//没有什么要求 我直接放你过去
arg2.doFilter(arg0, arg1);
System.out.println("放行 end");
}
@Override
public void init(FilterConfig arg0) throws ServletException {
System.out.println("过滤器被初始化了~~~");
}
}
liaten 监听器的使用
package com.zking.listener;
import javax.servlet.ServletContext;
import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
import javax.servlet.http.HttpSessionEvent;
import javax.servlet.http.HttpSessionListener;
public class OnlineCountListener implements HttpSessionListener,ServletContextListener {
@Override
public void contextDestroyed(ServletContextEvent arg0) {
System.out.println("上下文对象监听器被销毁了....");
}
@Override
public void contextInitialized(ServletContextEvent arg0) {
System.out.println("上下文对象监听器被初始化了....");
//得到上下文对象
ServletContext application = arg0.getServletContext();
application.setAttribute("count", new Integer(0));
}
@Override
public void sessionCreated(HttpSessionEvent arg0) {
System.out.println("会话对象监听器被创建了....");
ServletContext application = arg0.getSession().getServletContext();
Integer count = (Integer)application.getAttribute("count");
if(count == null) {
application.setAttribute("count", new Integer(1));
}else {
count++;
application.setAttribute("count", count);
}
}
@Override
public void sessionDestroyed(HttpSessionEvent arg0) {
System.out.println("会话对象监听器被销毁了...");
ServletContext application = arg0.getSession().getServletContext();
Integer count = (Integer)application.getAttribute("count");
if(count == null) {
application.setAttribute("count", new Integer(1));
}else {
count--;
application.setAttribute("count", count);
}
}
}
退出后需要手动调用销毁的方法或arg0.getSession().setMaxInactiveInterval(60);自动销毁
public class DestroySessionServlet extends HttpServlet{
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doPost(req, resp);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
HttpSession session = req.getSession();
session.invalidate();
}
}
数据库帮助类util |实体类entity | dao方法类与接口dao dao.impl |业务逻辑层与接口biz biz.impl |servlet包servlet |过滤器包filter |监听器分包listen