日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

SSM框架Filter登录后对权限进行甄别,没有权限不可访问指定页面

發布時間:2023/12/31 编程问答 80 豆豆
生活随笔 收集整理的這篇文章主要介紹了 SSM框架Filter登录后对权限进行甄别,没有权限不可访问指定页面 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

之前寫了關于SSM框架中利用Filter不登陸攔截訪問

如果用戶沒有登錄直接訪問的話

所有請求全部轉到登錄頁面登錄才可訪問

以此實現了初步的安全管理

之前去面試也是被問到了這個問題

ps:講真,現在真的有好多安全控件兒,用這個的還能有多少

好吧,作為基礎,畢竟筆者也是新人一枚

話說回來,講到之前面試被問到這個問題

也就是,在登錄成功之后,那么后續的

比如一些只有leader才能使用的管理頁面怎么去攔截呢

總不能你登錄之后,從某些渠道得到了內頁的登錄地址

然后直接輸入地址就可以訪問內頁了?

當然是不可能的

今天更新:小白篇:關于內頁訪問的權限校驗

當然還是使用Filter....畢竟別的筆者是真的不會啊,哈哈哈哈

上代碼:以之前的登錄攔截為基礎

SSM框架利用Filter實現頁面不登陸攔截,禁止跳過登錄強制訪問

今日代碼:

public class UrlFilter implements Filter{@Overridepublic void init(FilterConfig filterConfig) throws ServletException {// TODO Auto-generated method stub}@Overridepublic void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)throws IOException, ServletException {// TODO 對全棧url進行過濾//將request和response對象強轉為http類型HttpServletRequest req=(HttpServletRequest)request;HttpServletResponse resp = (HttpServletResponse)response;//獲取訪問的地址String url = req.getRequestURI();//允許所有人訪問的地址,全部定義到數組中String[] urls={"tologin.do","login.do","error.do","logout.do","top.do","left.do","right.do"};//用來判斷用戶當前訪問地址是否在不登陸可訪問的權限內boolean contains=true;for(String u:urls){//url的截取7:因為我的uri根中是 “/dscms/” 共七個字符,根據個人情況,如果沒有,不用截取if(url.substring(7).equals(u)){contains=false;}}//獲取session中的對象判斷是否登錄//攔截所有的 .do 請求但不包含tologin.do//jsp文件已經封裝到webinf下 不用過濾 之過濾 .do請求即可if(url.contains(".do")&contains) {//獲取sessionHttpSession session = req.getSession();TUser user=(TUser) session.getAttribute("USER");if(user==null){//如果用戶為空,說明沒有登錄,返回到登錄頁面resp.sendRedirect("/dscms/tologin.do");chain.doFilter(req, resp);}else {//用戶不為空,說明用戶登錄了,訪問網址的時候驗證權限//驗證權限,如果當前訪問地址沒有在用戶權限范圍內提示地址錯誤if(chkPermission(req)){//繼續執行過濾連的剩余部分chain.doFilter(req, resp);}else {//沒有權限訪問,返回錯誤代碼或者自己定義的錯誤頁面resp.sendError(404);//resp.sendRedirect("../error.do");chain.doFilter(req, resp);}}}chain.doFilter(req, resp);}//判斷當前地址權限是否在用戶權限范圍內private boolean chkPermission(HttpServletRequest request){//1、獲取用戶當前訪問的uriString uri=request.getRequestURI().substring(7);//1.1 判斷當前uri訪問需要的權限id//截取當前uri對應的權限地址并查詢//根據權限地址查詢權限idSystem.out.println(uri);//獲取permission實例:filter中是無法自動注入的,因為這樣生成兩個該filter的實例A和B(A:tomcat之類的容器管理,B為spring管理)//2、獲取當前用戶的權限集合TUser user=(TUser)request.getSession().getAttribute("USER");List<TPermission> permissions = user.getPermissions();//遍歷用戶當前權限列表,判斷權限for(TPermission pers:permissions) {if(pers.getUrl()!=null&&!"".equals(pers.getUrl())){if (pers.getUrl().equals(uri)) {//2.1 、判斷,如果當前uri的id在用戶權限集合中返回truereturn true;}}}//2.2、 如果不在權限中,返回falsereturn false;}@Overridepublic void destroy() {// TODO Auto-generated method stub}}

之前的文章上面也發出來了

今天用的還是以之前的Filter類作為基礎

在用戶登錄之后,繼續加了一層驗證

也就是在判斷用戶已經登錄之后

if(user==null){//如果用戶為空,說明沒有登錄,返回到登錄頁面resp.sendRedirect("/dscms/tologin.do");chain.doFilter(req, resp);}else {//用戶不為空,說明用戶登錄了,訪問網址的時候驗證權限//驗證權限,如果當前訪問地址沒有在用戶權限范圍內提示地址錯誤if(chkPermission(req)){//繼續執行過濾連的剩余部分chain.doFilter(req, resp);}else {//沒有權限訪問,返回錯誤代碼或者自己定義的錯誤頁面resp.sendError(404);//resp.sendRedirect("../error.do");chain.doFilter(req, resp);}}

也就是這里繼續校驗

下面封裝了一個chkPermission()方法

如果寫在一起實在顯得臃腫

//判斷當前地址權限是否在用戶權限范圍內private boolean chkPermission(HttpServletRequest request){//1、獲取用戶當前訪問的uriString uri=request.getRequestURI().substring(7);//1.1 判斷當前uri訪問需要的權限id//截取當前uri對應的權限地址并查詢//根據權限地址查詢權限idSystem.out.println(uri);//獲取permission實例:filter中是無法自動注入的,因為這樣生成兩個該filter的實例A和B(A:tomcat之類的容器管理,B為spring管理)//2、獲取當前用戶的權限集合TUser user=(TUser)request.getSession().getAttribute("USER");List<TPermission> permissions = user.getPermissions();//遍歷用戶當前權限列表,判斷權限for(TPermission pers:permissions) {if(pers.getUrl()!=null&&!"".equals(pers.getUrl())){if (pers.getUrl().equals(uri)) {//2.1 、判斷,如果當前uri的id在用戶權限集合中返回truereturn true;}}}//2.2、 如果不在權限中,返回falsereturn false;}

開始的時候本來是想要去校驗權限的id,但是后來發現其實用substring去截取著實更簡單一點(字符串真的操作真的很重要)平時要常看看

還有一點:filter中是不能使用Autowired的,如果需要使用注入的話,可以如下

ServletContext context = request.getServletContext();ApplicationContext ctx = WebApplicationContextUtils.getWebApplicationContext(context);SessionService sessionService = ctx.getBean(SessionService.class);

還記得這個把,剛開始接觸spring的時候

通過been.xml去過去,怎么說呢,手動配置加載這樣

用框架多了,很多以前的基礎都忘了

基礎其實才是最重要的,框架千萬種,萬變不離其宗

只要基礎牢固,什么框架都不在話下

可是要是你只會框架,恐怕到時候真的遇到問題就真的老大難咯

最后:關于權限還有部分沒有實現——關于部分用戶擁有只讀權限,部分用戶擁有全部操作權限這部分,個人想法是在權限表中在多加一個字段,驗證的時候去驗證具體 只讀/操作,不知道大家有沒有什么更好的辦法,歡迎評論區討論留言哈

總結

以上是生活随笔為你收集整理的SSM框架Filter登录后对权限进行甄别,没有权限不可访问指定页面的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。