[JSP&JDBC]JDBC+Servlet+过滤器访问登陆实例/servlet之filter过滤器
2017-12-29 12:03
549 查看
》》实现的方法
创建一个类去实现servlet里的fiter接口,重写这三个方法package com.yiki.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; public class loginFilter implements Filter { public void doFilter(ServletRequest arg0, ServletResponse arg1, FilterChain chain) throws IOException, ServletException { /* * 完成过滤器实际操作 * FilterChain参数调用chain.doFilter方法,将请求传给下一个过滤器,或利用转发,重定向将请求转发到其他资源 */ } public void destroy() { /* * 释放资源 */ } public void init(FilterConfig arg0) throws ServletException { /* * 该方法可以读取web.xml里过滤器的参数(<init-param><param-name>参数<param-name></init-param>) */ } }web.xml示例
/*过滤后发现请求这个项目的所有资源都无法进入了……(放行: chain.doFilter(request, response); )
<filter> <filter-name>myFilters</filter-name> <filter-class>com.yiki.filter.loginFilter</filter-class> </filter> <filter-mapping> <filter-name>myFilters</filter-name> <url-pattern>/*</url-pattern> </filter-mapping>
》》过滤器链
映射地址相等的两个过滤器会变成过滤器链,服务器会根据web.xml的过滤器定义顺序依次执行,但是是回圈型,第二个filter完成后会回到第一个filter
》》dispatchers关键字:
》》实例
查看本次实例测试项目地址效果图:只有登陆才能查看功能页
实例结构
思路解释:
首先知道要过滤的东西,就是webroot下的JSP功能页面,从第二个包filter开始,定义一个过滤器,这个过滤器是处理页面的JSP以及过滤mySerlet(处理查询数据库)和findServlet(分页用),而loginServlet则是处理匹配用户登录的,切不可加入过滤器的过滤规则。web.xml
<?xml version="1.0" encoding="UTF-8"?> <web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"> <display-name></display-name> <filter> <filter-name>myFilters</filter-name> <filter-class>com.yiki.filter.loginFilter</filter-class> </filter> <filter-mapping> <filter-name>myFilters</filter-name> <url-pattern>/JSP/*</url-pattern> <servlet-name>myServlet</servlet-name> <servlet-name>findServler</servlet-name> </filter-mapping> <error-page> <error-code>500</error-code> <location>/error.jsp</location> </error-page> <servlet> <servlet-name>myServlet</servlet-name> <servlet-class>com.yiki.Servlet.myServlet</servlet-class> </servlet> <servlet> <servlet-name>findServler</servlet-name> <servlet-class>com.yiki.Servlet.findServler</servlet-class> </servlet> <servlet> <description>This is the description of my J2EE component</description> <display-name>This is the display name of my J2EE component</display-name> <servlet-name>loginServlet</servlet-name> <servlet-class>com.yiki.Servlet.loginServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>myServlet</servlet-name> <url-pattern>/servlet/myServlet</url-pattern> </servlet-mapping> <servlet-mapping> <servlet-name>findServler</servlet-name> <url-pattern>/servlet/findServler</url-pattern> </servlet-mapping> <servlet-mapping> <servlet-name>loginServlet</servlet-name> <url-pattern>/servlet/loginServlet</url-pattern> </servlet-mapping> <welcome-file-list> <welcome-file>index.jsp</welcome-file> </welcome-file-list> </web-app>
如果已经登陆后应该这样请求路径而不是写包路径
<%@ page language="java" import="java.util.*" pageEncoding="gb2312" contentType="text/html; charset=gb2312"%> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <body> <table align="center"> <tr> <td>欢迎您,<%=session.getAttribute("username")%></td> <td><a href="loginServlet?action=out">退出</a></td> </tr> </table> <h1 align="center">Welcome</h1> <table align="center"> <tr> <td><a href="myServlet?action=look">查看总表</a></td> <td><a href="loginServlet?action=delete&success=yes">删除数据</a></td> <td><a href="loginServlet?action=insertdata&success=yes">插入数据</a></td> <td><a href="loginServlet?action=update&success=yes">更新数据</a></td> <td><a href="loginServlet?action=querdata&success=yes">查询数据</a></td> <td><a href="findServler">分页显示</a></td> </table> </body> </html>而还没登陆的页面是:(但是是无论如何都访问不了的)
<%@ page language="java" import="java.util.*" pageEncoding="gb2312" contentType="text/html; charset=gb2312"%> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <body> <table align="center"> <tr> <td><a href="login.jsp">登陆</a></td> <td><a href="signup.jsp">注册</a></td> </tr> </table> <h1 align="center">请先登录</h1> <table align="center"> <tr> <td><a href="servlet/myServlet?action=look">查看总表</a></td> <td><a href="JSP/delete.jsp">删除数据</a></td> <td><a href="JSP/insert.jsp">插入数据</a></td> <td><a href="JSP/update.jsp">更新数据</a></td> <td><a href="JSP/querbyform.jsp">查询数据</a></td> <td><a href="servlet/findServler">分页显示</a></td> </table> </body> </html>
处理登陆匹配的servlet
package com.yiki.Servlet; import java.io.IOException; import java.net.HttpCookie; import java.util.ArrayList; import java.util.List; import javax.servlet.ServletException; import javax.servlet.http.Cookie; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpSession; import com.yiki.dbutil.Student; import com.yiki.dbutil.StudentImpl; import com.yiki.loginUti c7cd l.User; import com.yiki.loginUtil.UserImpl; public class loginServlet extends HttpServlet { private static final long serialVersionUID = 1L; private String action; UserImpl dao = new UserImpl(); User user = new User(); ArrayList<User> list = new ArrayList<User>(); public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doPost(request, response); } public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { request.setCharacterEncoding("gb2312"); action = request.getParameter("action"); if (action != null) { this.action = request.getParameter("action"); if (action.equals("insert")) {// 注册 try { String name = request.getParameter("username"); byte[] n = name.getBytes("ISO-8859-1"); int password = Integer.parseInt(request.getParameter("password")); user.setUsername(name); user.setPassword(password); dao.add(user); request.getRequestDispatcher("/success.jsp").forward(request, response); } catch (Exception e) { e.printStackTrace(); } } else if (action.equals("login")) {//登录 String username = request.getParameter("username"); int password = Integer.parseInt(request.getParameter("password")); HttpSession session = request.getSession(); session.setAttribute("username", username); try { List<User> list = dao.query();//匹配 for (int i = 0; i < list.size(); i++) { User u = (User) list.get(i); if (username.equals(u.getUsername()) && password == u.getPassword()) { Cookie cookie = new Cookie("success", "yes");//如果成功就创建cookie记录 response.addCookie(cookie); request.getRequestDispatcher("/JSP/welcom.jsp").forward(request, response); return; } } request.getRequestDispatcher("/error.jsp").forward(request, response); } catch (Exception e) { e.printStackTrace(); } } else if (action.equals("out")) {退出登录,清除cookie Cookie cookie = new Cookie("success", null); cookie.setMaxAge(0); response.addCookie(cookie); response.sendRedirect("../index.jsp"); } else if (action.equals("back")) {//返回,因为直接访问包下的文件会被过滤器拦截,why??????? String success = request.getParameter("success"); if (success.equals("yes")) { request.getRequestDispatcher("/JSP/welcom.jsp").forward(request, response); return; } request.getRequestDispatcher("/error.jsp").forward(request, response); } else if (action.equals("update")) {//跳转到更新页面 String success = request.getParameter("success"); if (success.equals("yes")) { request.getRequestDispatcher("/JSP/update.jsp").forward(request, response); return; } request.getRequestDispatcher("/error.jsp").forward(request, response); } else if (action.equals("delete")) {//跳转到删除页面 String success = request.getParameter("success"); if (success.equals("yes")) { request.getRequestDispatcher("/JSP/delete.jsp").forward(request, response); return; } request.getRequestDispatcher("/error.jsp").forward(request, response); } else if (action.equals("insertdata")) {//跳转到插入数据页面 String success = request.getParameter("success"); if (success.equals("yes")) { request.getRequestDispatcher("/JSP/insert.jsp").forward(request, response); return; } request.getRequestDispatcher("/error.jsp").forward(request, response); } else if (action.equals("querdata")) {//跳转到查询页面 String success = request.getParameter("success"); if (success.equals("yes")) { request.getRequestDispatcher("/JSP/querbyform.jsp").forward(request, response); return; } request.getRequestDispatcher("/error.jsp").forward(request, response); } } } }
过滤器
package com.yiki.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; import javax.servlet.http.Cookie; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; public class loginFilter implements Filter { public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { /* * 完成过滤器实际操作 * FilterChain参数调用chain.doFilter方法,将请求传给下一个过滤器,或利用转发,重定向将请求转发到其他资源 */ HttpServletRequest rqs = (HttpServletRequest) request; HttpServletResponse res = (HttpServletResponse) response; String yes; Cookie[] cookies = rqs.getCookies(); for (int i = 0; cookies != null && i < cookies.length; i++) { Cookie cook = cookies[i]; if (cook.getName().equals("success")) { // 获取键 yes = cook.getValue().toString(); // 获取值 System.out.println(yes); if (yes.equals("yes")) { chain.doFilter(request, response); return; } } } request.getRequestDispatcher("/error.jsp").forward(request, response); } public void destroy() { /* * 释放资源 */ } public void init(FilterConfig arg0) throws ServletException { /* * 该方法可以读取web.xml里过滤器的参数 */ } }如果登陆成功的JSP
<%@page import="com.yiki.dbutil.*"%> <%@ page language="java" import="java.util.*,java.sql.*" pageEncoding="gb2312"%> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <body> <center> <h1>操作成功</h1> <a href="myServlet?action=look">查看</a> <a href="loginServlet?action=back&success=yes">返回</a> </center> </body> </html>
其他页面具体参考之前的实例,按需要修改路径即可
问题:为什么内部跳转就可以访问被过滤的页面,而在外部访问无论如何都无法访问被匹配。这块还是很迷emmmmm.........
相关文章推荐
- [JSP&JDBC]MVC模型查询学生表实例(servlet+javabean+jsp)/sendRedirect/getRequestDispatcher
- [JSP&JDBC]购物车实例(MVC模型+JSP+javascript+Servlet+JavaBean)
- Jsp+Servlet+JavaBean+JDBC登陆实例
- 在web.xml定义,在网页中使用变量实例 使用只有创建变量的servlet才可以访问的<init-param>方式 附带登陆和跳转实现
- javaWeb入门<1>Servlet+Jsp+JavaBean实现MVC开发模式登陆注册实例详解
- JSP+Servlet+Tomcat+Mysql实现用户注册、登陆、修改、添加、查看详情、分页实例之---数据库
- JSP+Servlet+Tomcat+Mysql实现注册、登陆、修改、添加、查看、分页实例之----用户登陆
- JSP+Servlet+Tomcat+Mysql实现注册、登陆、修改、添加、查看、分页实例之----公共类代码
- JSP+Servlet+Tomcat+Mysql实现注册、登陆、修改、添加、查看、分页实例之----用户注册
- JSP基础语法之十四:Servlet过滤器,编码过滤器、验证登陆状态过滤器
- 登陆实例(JSP+Servlet+JavaBean)
- jsp+servlet登陆实例演示
- JSP+Servlet+Tomcat+Mysql实现注册、登陆、修改、添加、查看、分页实例之----密码修改
- jsp&servlet的登陆界面以及增删改查功能的实现
- jsp+servlet+jdbc实现简单的登陆验证
- 5个Servlet过滤器实例源码(JSP)
- JSP+Servlet+Tomcat+Mysql实现注册、登陆、修改、添加、查看、分页实例之----查询列表
- MVC(JSP+JavaBean+Servlet)入门实例:用户登陆验证
- Servlet&JSP 第五章 进阶API、过滤器与监听器
- jsp&servlet和JDBC的综合使用