لقد كنت أتعلم JSP لفترة طويلة، وعملت على سبعة أو ثمانية مشاريع، ولكن في جميع المشاريع، عندما يقوم المستخدم بتسجيل الدخول، فإنه سينتقل مباشرة إلى الصفحة التي لديه الإذن بها، أو يعرضها روابط لصفحات يمكن الوصول إليها. استخدم هذا الأسلوب للتحكم في الوصول بسذاجة. لم أعتقد أبدًا أنه إذا لم أقم بتسجيل الدخول، فيمكنني الوصول مباشرة إلى صفحة المستخدم عن طريق إدخال العنوان.
يتم التحكم في الأذونات في jsp من خلال عامل التصفية المدمج في جميع أطر التطوير. إذا كان إطار التطوير غير قابل للتطبيق، تتوفر طرق التنفيذ التالية:
تسجيل الدخولFilter.java
انسخ رمز الكود كما يلي:
الطبقة العامة LoginFilter تنفذ عامل التصفية {
سلسلة خاصة PermitUrls[] = null;
سلسلة خاصة gotoUrl = فارغة؛
تدمير الفراغ العام () {
// TODO طريقة تم إنشاؤها تلقائيًا stub
PermitUrls = null;
gotoUrl = null;
}
doFilter الفراغ العام (طلب ServletRequest، استجابة ServletResponse،
سلسلة FilterChain) تطرح IOException، ServletException {
// TODO طريقة تم إنشاؤها تلقائيًا stub
HttpServletRequest res=(HttpServletRequest) request;
HttpServletResponse resp=(HttpServletResponse)response;
إذا(!isPermitUrl(طلب)){
إذا(filterCurrUrl(طلب)){
System.out.println("--->الرجاء تسجيل الدخول");
resp.sendRedirect(res.getContextPath()+gotoUrl);
يعود؛
}
}
System.out.println("--->السماح بالوصول");
chain.doFilter(request, Response);
}
عامل التصفية المنطقي العامCurrUrl(طلب ServletRequest){
عامل التصفية المنطقي = خطأ؛
HttpServletRequest res=(HttpServletRequest) request;
المستخدم user =(User) res.getSession().getAttribute("user");
إذا (فارغة == المستخدم)
مرشح = صحيح؛
مرشح العودة
}
منطقية عامة isPermitUrl(طلب ServletRequest) {
boolean isPermit = false;
String currentUrl = currentUrl(request);
إذا (permitUrls != null && PermitUrls.length > 0) {
for (int i = 0; i < leaveUrls.length; i++) {
إذا (permitUrls[i].equals(currentUrl)) {
isPermit = true;
استراحة؛
}
}
}
العودة هي تصريح؛
}
// عنوان الطلب
سلسلة عامة currentUrl(طلب ServletRequest) {
HttpServletRequest res = (HttpServletRequest) request;
مهمة السلسلة = request.getParameter("مهمة");
مسار السلسلة = res.getContextPath();
String uri = res.getRequestURI();
إذا (مهمة!= فارغة) {//تنسيق uri xx/ser
uri = uri.substring(path. length(), uri. length()) + "؟" + "task ="
+ مهمة؛
} آخر {
uri = uri.substring(path. length(), uri. length());
}
System.out.println("عنوان الطلب الحالي:" + uri);
إرجاع أوري؛
}
الحرف الفراغي العام (FilterConfig filterConfig) يلقي ServletException {
// TODO طريقة تم إنشاؤها تلقائيًا stub
String leaveUrls = filterConfig.getInitParameter("permitUrls");
String gotoUrl = filterConfig.getInitParameter("gotoUrl");
this.gotoUrl = gotoUrl;
إذا (permitUrls != null && PermitUrls.length() > 0) {
this.permitUrls = PermitUrls.split("،);
}
}
}
Web.xml
انسخ رمز الكود كما يلي:
<فلتر>
<filter-name>loginFilter</filter-name>
<filter-class>filter.LoginFilter</filter-class>
<init-param>
<param-name>تجاهل</param-name>
<param-value>خطأ</param-value>
</init-param>
<init-param>
<param-name>permitUrls</param-name>
<param-value>/,/servlet/Loginservlet?task=login,/public.jsp,/login.jsp</param-value>
</init-param>
<init-param>
<param-name>gotoUrl</param-name>
<param-value>/login.jsp</param-value>
</init-param>
</فلتر>
<تعيين عامل التصفية>
<filter-name>loginFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
ينفذ هذا الرمز القصير بشكل أساسي تصفية تسجيل دخول المستخدم، ومبدأ تصفية الأذونات هو نفسه. ما عليك سوى تغيير الحكم بشأن ما إذا كان المستخدم قد قام بتسجيل الدخول إلى ما إذا كان لديه إذن!