[JSP&JDBC]JDBC+Servlet+过滤器访问登陆实例/servlet之filter过滤器

8 篇文章 0 订阅


》》实现的方法

创建一个类去实现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.loginUtil.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.........











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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值