登陸過濾器
Ⅰ 判斷用戶登錄是用springmvc 攔截器還是filter
在中用過filter過濾器,在springmvc中還有攔截器,它們都能過濾請求,但是到底有什麼區別呢?
一、定義
攔截器 :是在面向切面編程的就是在你的service或者一個方法,前調用一個方法,或者在方法後調用一個方法比如動態代理就是攔截器的簡單實現,在你調用方法前列印出字元串(或者做其它業務邏輯的操作),也可以在你調用方法後列印出字元串,甚至在你拋出異常的時候做業務邏輯的操作。
過濾器:是在javaweb中,你傳入的request、response提前過濾掉一些信息,或者提前設置一些參數,然後再傳入servlet或者struts的action進行業務邏輯,比如過濾掉非法url(不是login.do的地址請求,如果用戶沒有登陸都過濾掉),或者在傳入servlet或者 struts的action前統一設置字元集,或者去除掉一些非法字元.。
二、xml文件配置
1.filter
該過濾器的方法是創建一個類XXXFilter實現此介面,並在該類中的doFilter方法中聲明過濾規則,然後在配置文件web.xml中聲明他所過濾的路徑
<filter>
<filter-name>XXXFilter</filter-name>
<filter-class>
com.web.util.XXXFilter
</filter-class>
</filter>
<filter-mapping>
<filter-name>XXXFilter</filter-name>
<url-pattern>*.action</url-pattern>
</filter-mapping>
<filter>
<filter-name>XXXFilter</filter-name>
<filter-class>
com.web.util.XXXFilter
</filter-class>
</filter>
<filter-mapping>
<filter-name>XXXFilter</filter-name>
<url-pattern>*.action</url-pattern>
</filter-mapping>
2.Interceptor
它也要實現HandlerInterceptor 介面,這里只介紹方法註解配置
<!-- 攔截器 -->
<mvc:interceptors>
<!-- 多個攔截器,順序執行 -->
<mvc:interceptor>
<mvc:mapping path="/entryOrJsonController/*" /><!-- 如果不配置或/*,將攔截所有的Controller -->
<bean class="com.wy.interceptor.CommonInterceptor"></bean>
</mvc:interceptor>
</mvc:interceptors>
<!-- 攔截器 -->
<mvc:interceptors>
<!-- 多個攔截器,順序執行 -->
<mvc:interceptor>
<mvc:mapping path="/entryOrJsonController/*" /><!-- 如果不配置或/*,將攔截所有的Controller -->
<bean class="com.wy.interceptor.CommonInterceptor"></bean>
</mvc:interceptor>
</mvc:interceptors>
三、具體區別
filter
Interceptor
多個的執行順序
根據filter mapping配置的先後順序
按照配置的順序,但是可以通過order控制順序
規范
在Servlet規范中定義的,是Servlet容器支持的
Spring容器內的,是Spring框架支持的。
使用范圍
只能用於Web程序中
既可以用於Web程序,也可以用於Application、Swing程序中。
深度
Filter在只在Servlet前後起作用
攔截器能夠深入到方法前後、異常拋出前後等
四、總結
兩者的本質區別:攔截器是基於java的反射機制的,而過濾器是基於函數回調。從靈活性上說攔截器功能更強大些,Filter能做的事情,他都能做,而且可以在請求前,請求後執行,比較靈活。Filter主要是針對URL地址做一個編碼的事情、過濾掉沒用的參數、安全校驗(比較泛的,比如登錄不登錄之類),太細的話,還是建議用interceptor。不過還是根據不同情況選擇合適的。
Ⅱ 用過濾器判斷用戶是否登錄,並且可以進行操作
你在session中設置來的是User對象,所以自你通過session去取時,也只能取到User對象
User user = (User) Session.getAttribute("loginUser");
然後判斷user不為空和user.getUsername不為空
Ⅲ java單點登錄用過濾器怎麼實現
1、在普通站點A,B上配置抄過濾器,如果訪問到A的頁面時,先訪問本地SESSION看是否登錄,如果沒有,則訪問SSO看是否登錄,如果沒有則轉到公共登錄界面
2、公共登錄界面登錄完以後寫SSO的SESSION,並通過地址欄返回給A登錄的用戶名
3、A寫本地SESSION,完成登錄過程。
4、當訪問B應用時,先訪問本地SESSION,未登錄,則同樣跳轉到SSO,SSO取到本地SESSION的用戶名,返回給B已登錄。B寫本地SESSION。完成登錄過程。
5、A登出時,先殺本地SESSION,調用SSO的殺全局SESSION方法,SSO清空本地SESSION,同時也清空應用B的SESSION,完成單點登出。
Ⅳ java程序實現登陸。用戶沒有登錄但訪問非登錄的頁面,使用過濾器跳轉到登錄頁,登錄後怎麼回到訪問頁
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
HttpServletRequest req = (HttpServletRequest)request;
if(req.getSession().getAttribute("user")==null){
req.setAttribute("error", "請你先登錄");
//非法請求才會進到這裡面,在這里保存請求的url地址,在成功登錄後再進行跳轉
req.getSession().setAttribute("goUrl", req.getRequestURL()+"?"+ req.getQueryString());
request.getRequestDispatcher("/ulogin.jsp").forward(request, response);
}
else{
chain.doFilter(request, response);
}
}
上面的代碼是過濾器中的代碼
下面的是servlet中的代碼
if(request.getSession().getAttribute("goUrl")!=null){
String url = (String)request.getSession().getAttribute("goUrl");
response.sendRedirect(url);
}
else{
response.sendRedirect("/webshopping/index.jsp");
}
Ⅳ jsp 登陸驗證過濾器 圖片顯示 問題
把你的工程頁都放在一個文件夾里 ,單獨把index.jsp(登陸頁)拿出來。xml里只過濾工程頁文件夾,別過濾登陸頁就OK了。
Ⅵ java web登陸狀態過濾器 圖片也被攔截了,怎麼辦
在過濾來器中添加代碼源String uri = request.getRequestURI();
過濾uri後綴是.js,.css的不進行校驗就好了,另外一種方法則相反,判斷你要的後綴,然後過濾,其他的都放行
Ⅶ 在JSP中如何利用過濾器實現從SQL表中登錄
jsp中實現過濾器登錄的方法是配置filter:
在servlet中實現代碼如下:
HttpSession session = request.getSession(false);
User user = (session != null) ? session.getAttribute("user") : null;
if (user != null) {
chain.doFilter(request, response);
} else {
response.sendRedirect(request.getContextPath() + "/login");
}
jsp頁面提交後到驗證servlet:
String username = request.getParameter("username");
String password = request.getParameter("password");
Map<String, String> messages = new HashMap<String, String>();
if (username == null || username.isEmpty()) {
messages.put("username", "Please enter username");
}
if (password == null || password.isEmpty()) {
messages.put("password", "Please enter password");
}
if (messages.isEmpty()) {
User user = userService.find(username, password);
if (user != null) {
request.getSession().setAttribute("user", user);
response.sendRedirect(request.getContextPath() + "/home");
return;
} else {
messages.put("login", "Unknown login, please try again");
}
}
request.setAttribute("messages", messages);
request.getRequestDispatcher("/WEB-INF/login.jsp").forward(request, response);
Ⅷ 關於JAVA WEB中登陸過濾器的問題
你先把過濾器new出來,再調用不就好了
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
response.setContentType("text/html;charset=gbk");
PrintWriter out = response.getWriter();
String name = request.getParameter("username");
String password = request.getParameter("password");
HttpSession session = request.getSession();
if(name.equals("admain") && password.equals("admain")){
session.setAttribute("usertype", "admain");
Fileter f=new Fileter();
f.doFilter(request,response,chain);//反正你先把過濾器new出來,再調用不就好了,具體的屬性看實際情況,我是手寫代碼,難免有錯
}else{
out.print("<a href=Admain.html>用戶頁面</a>");
}
}
Ⅸ 怎麼搞一個servlet登錄過濾器
把JSP頁面全部放在WEB-INF下面 ,編寫一個BaseServlet繼承自HttpServlet,然後其餘的servlet集成自BaseServlet,在這個servlet裡面判斷session,有值的時候轉發到servlet裡面 沒有值的話 跳轉到登陸頁面 不就可以了?或者在filter裡面寫上
HttpServletRequest req = (HttpServletRequest)request;
HttpServletResponse resp = (HttpServletResponse)response;
String uri = req.getRequestURI();
System.out.println( uri );
// 如果請求的路徑是首頁的資源,那麼不需要過濾
if ( !"/loginServlet".equals(uri) && !"/".equals(uri) && !uri.startsWith("/img/") && !uri.startsWith("images") ) {
// 過濾請求,保證訪問的資源一定要在用戶登錄後才可訪問
HttpSession session = req.getSession();
if ( session.isNew() ) {
// 跳轉到首頁
resp.sendRedirect("/");
} else {
User user = (User)session.getAttribute(Const.SESS_PARAM_USER);
if ( user == null ) {
// 跳轉到首頁
resp.sendRedirect("/");
} else {
chain.doFilter(request, response);
}
}
} else {
chain.doFilter(request, response);
}
Ⅹ 校驗用戶是否登錄過濾器Filter
CheckLoginFilter net.cnki.tpi.cms.util.CheckLoginFilter redirectURL /login.jsp notCheckURLList /error.jsp;/login.jsp CheckLoginFilter /* 2、然後新創建一個CheckLoginFilter.java類,代碼如下:
/** * 校驗用戶是否已登錄過濾器 * @author lpz * */ public class CheckLoginFilter implements Filter { private FilterConfig filterConfig = null; private String redirectURL = null; private List notCheckURLList = new ArrayList(); public CheckLoginFilter() { } public void destroy() { notCheckURLList.clear(); } public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain chain) throws IOException, ServletException { HttpServletRequest request = (HttpServletRequest)servletRequest; HttpServletResponse response = (HttpServletResponse)servletResponse; HttpSession session = request.getSession(); Object userInfo = session.getAttribute("userInfo"); if(!(request) && userInfo==null){ //重定向到指定頁面 response.sendRedirect(request.getContextPath() + redirectURL); }else{ //繼續響應請求 chain.doFilter(servletRequest, servletResponse); } } public void init(FilterConfig fConfig) throws ServletException { this.filterConfig = fConfig; redirectURL = filterConfig.getInitParameter("redirectURL"); String notCheckURLListStr = filterConfig.getInitParameter("notCheckURLList"); if(!MyStringUtil.isNullOrEmpty(notCheckURLListStr)){ //將字元串轉化為list notCheckURLList = MyStringUtil.convStrToList(notCheckURLListStr,";"); } } /** * 校驗當前請求是否在不過濾的列表中 * @param request * @return */ private boolean (HttpServletRequest request) { String uri = request.getServletPath() + (request.getPathInfo() == null ?