1. Pengkodean karakter terpadu di seluruh situs
Charset parameter konfigurasi menunjukkan pengkodean karakter mana yang digunakan untuk menangani masalah Cina dari parameter permintaan formulir HTML
Paket me.gacl.web.filter; import java.io.ioException; impor javax.servlet.filter; import javax.servlet.filterchain; import javax.servlet.filterconfig; import javax.servlet.servletexception; impor javax.servlet. javax.servlet.servletresponse; import javax.servlet.http.httpservletrequest; impor javax.servlet.http.httpservletRequestwrapper; poundscriptionspriptionsprippription.http.httpservletResponstrapper; Selesaikan masalah Cina yang kacau di seluruh situs*/ Kelas Publik KaraktereCodingFilter mengimplementasikan filter {private filterconfig filterconfig = null; // Atur karakter default yang mengkode string pribadi defaultCharset = "UTF-8"; public void dofilter (servletRequest req, servletResponse resp, rantai filterchain) melempar ioException, servletException {httpservletRequest request = (httpservletRequest) req; Respons httpservletResponse = (httpservletResponse) resp; String charset = filterconfig.getInitparameter ("charset"); if (charset == null) {charset = defaultCharset; } request.setcharacterencoding (charset); response.setcharacterencoding (charset); response.setContentType ("Teks/html; charset ="+charset); MyCharacterencodingRequest RequestWrapper = MyCharacterencodingRequest baru (permintaan); chain.dofilter (requestwrapper, respons); } public void init (filterconfig filterconfig) melempar servletException {// dapatkan informasi konfigurasi inisialisasi dari filter this.filterconfig = filterconfig; } public void hancur () {}}/*1. Implement the same interface as the enhanced object 2. Define a variable Remember the enhanced object 3. Define a constructor to receive the enhanced object 4. Overwrite the methods that need to be enhanced 5. For methods that do not want to be enhanced, directly call the method of the enhanced object (target object) */ class MyCharacterEncodingRequest extends HttpServletRequestWrapper{ private HttpServletRequest request; public mycharacterencodingRequest (permintaan httpservletRequest) {super (permintaan); this.request = permintaan; } /* Tulis ulang metode getParameter* @Lihat javax.servlet.servletrequestwrapper#getParameter (java.lang.string)* /@Override Public String getParameter (name string) {coba {// Dapatkan nilai parameter nilai string = this.request.getParameter (name); if (value == null) {return null; } // Jika data tidak dikirimkan di GET, langsung kembalikan nilai yang diperoleh IF (! This.request.getMethod (). EqualSignorecase ("get")) {nilai pengembalian; } else {// Jika data dikirimkan di GET, nilai yang diperoleh adalah nilai transcoded = string baru (value.getBytes ("iso8859-1"), this.retcharcharacterencoding ()); nilai pengembalian; }} catch (Exception e) {lempar runtimeException baru (e); }}} Konfigurasi dalam file web.xml adalah sebagai berikut:
<filter> <nilter-name> karakterEncodingFilter </filter-name> <nilter-class> me.gacl.web.filter.characterencodingfilter </filter-class> <InT-param> <param-name> </param-name> <param-value> UTF-8 </param-value> </init-param> <param-value> UTF-8 </param-value> </init-param> <param-value> <filter-name> characterencodingFilter </tiler-name> <RURL-PATERS>/*</RURL-PATERS> </TERFERTER-MAPPING>
2. Browser dilarang di -cache semua halaman dinamis
Ada 3 bidang header respons HTTP yang dapat melarang browser dari cacheing halaman saat ini. Kode contoh dalam servlet adalah sebagai berikut:
Tidak semua browser dapat sepenuhnya mendukung tiga header respons di atas, jadi yang terbaik adalah menggunakan tiga header respons di atas secara bersamaan.
Paket me.gacl.web.filter; import java.io.ioException; impor javax.servlet.filter; import javax.servlet.filterchain; import javax.servlet.filterconfig; import javax.servlet.servletexception; impor javax.servlet. javax.servlet.servletresponse; import javax.servlet.http.httpservletrequest; impor javax.servlet.htp.httpservletResponse;/*** @classname: nocachefilter* @deskripsi: browser dilarang dari canes: lip -caping: nocachefilter* @description: browser dilarang dari caPhibribed dari cached: nocachefilter* @deskrip @date: 2014-8-31 11:25:40 pm**/ public class NoCacheFilter implements Filter { public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws IOException, ServletException { //Forcing ServletRequest to HttpServletRequest HttpServletRequest request = (Httpservletrequest) req; // memaksa servletResponse ke httpservletResponse httpservletResponse respons = (httpservletResponse) resp; // Memaksa respon respon ke httpservletResponse respons = (httpservletResponse) resp; // melarang browser untuk menyimpan semua halaman dinamis respons.setDateheader ("kedaluwarsa", -1); response.setheader ("cache-control", "no-cache"); response.setheader ("pragma", "no-cache"); rantai.dofilter (permintaan, respons); } public void init (filterconfig filterconfig) melempar servletException {} public void dashare () {}} Konfigurasi dalam file web.xml adalah sebagai berikut:
<filter> <nilter-name> nocachefilter </tiler-name> <nilter-class> me.gacl.web.filter.nocachefilter </filter-class> </filter> <nilter-Mapping> <nilter-name> nocachefilter </filter-name> <!-Intercept saja hanya permintaan JSP-> <servlet-name>*.
3. Kontrol sumber daya statis di halaman cache browser
Beberapa halaman dinamis mengacu pada beberapa gambar atau file CSS untuk memodifikasi efek halaman. Gambar -gambar dan file CSS ini sering tidak berubah, sehingga untuk meringankan tekanan pada server, Anda dapat menggunakan filter untuk mengontrol browser untuk menyimpan file -file ini untuk meningkatkan kinerja server.
Paket me.gacl.web.filter; import java.io.ioException; impor javax.servlet.filter; import javax.servlet.filterchain; import javax.servlet.filterconfig; import javax.servlet.servletexception; impor javax.servlet. javax.servlet.ServletResponse;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;/*** @ClassName: CacheFilter* @Description: filter*/ public class CacheFilter implements Filter { private FilterConfig filterConfig; public void dofilter (servletRequest req, servletResponse resp, rantai filterchain) melempar ioException, servletException {httpservletRequest request = (httpservletRequest) req; Respons httpservletResponse = (httpservletResponse) resp; // 1. Dapatkan sumber daya yang ingin diakses pengguna URI = request.getRequesturi (); // 2. Dapatkan nama sufiks dari sumber daya yang ingin diakses oleh pengguna Ext = Uri.substring (Uri.LastIndexof (".")+1); // Dapatkan waktu ketika sumber daya perlu di -cache string time = filterconfig.getInitparameter (ext); if (time! = null) {long t = long.parselong (waktu)*3600*1000; // atur cache response.setDateheader ("Expires", System.currentTimemillis () + t); } rantai.dofilter (permintaan, respons); } public void init (filterconfig filterconfig) melempar servletException {this.filterconfig = filterconfig; } public void dashar () {}} Konfigurasi dalam file web.xml adalah sebagai berikut:
<!-- Configure cache filter --> <filter> <filter-name>CacheFilter</filter-name> <filter-class>me.gacl.web.filter.CacheFilter</filter-class> <!-- Configure the web resources to be cached and the cache time in hours --> <init-param> <param-name>css</param-name> <param-value>4</param-value> </init-param> <Ilin-param> <param-name> jpg </param-name> <param-value> 1 </param-value> </it-param> <Ilin-param> <param-name> JS </param-name> <param-value> 4 </value </name> </init-n-name> <param-n-n-n-n-n-n-n-n-n-n- <param-value> 4 </param-value> </it-param> </tilter> <!-Mengkonfigurasi akhiran sumber daya web yang akan di-cache-> <nilter-Mapping> <Tiler-name> Cachefilter </filter-name> <rerl-Pattern>*. <rerl-pola>*. CSS </RURL-Pattern> </tiler-Mapping> <Perner-Mapping> <STERFER-NAME> CACHEFILTER </TERFERTER-NAME> <RORL-PATLE>*. JS </RORL-POLATE> </TERFERTER-MAPPING> <TERFERTER-MAPPING> <TERFERTER-NAME> CACHEFILTER </filter-name> <Rilter-POLADER>.
4. REALIT LOGIN OTOMATIS UNTUK PENGGUNA
Idenya adalah sebagai berikut:
1. Setelah pengguna masuk dengan sukses, kirim cookie dengan nama pengguna ke klien. Nilai cookie adalah nama pengguna dan kata sandi terenkripsi MD5.
2. Tulis autologinfilter. Filter ini memeriksa apakah pengguna memiliki cookie bernama pengguna. Jika demikian, hubungi DAO untuk memeriksa apakah nama pengguna dan kata sandi cookie cocok dengan database. Jika kecocokan dilakukan, objek pengguna (mis. Tanda login pengguna) disimpan dalam sesi untuk mencapai login otomatis.
Kode inti adalah sebagai berikut:
Pengontrol Penanganan Login Pengguna: LogInservlet
Paket me.gacl.web.controller; import java.io.ioException; import javax.servlet.servletException; impor javax.servlet.http.cookie; import javax.servlet.htp.httpservlet; impor javax.servlet.http.htpsvet; javax.servlet.http.HttpServletResponse;import me.gacl.dao.UserDao;import me.gacl.domain.User;import me.gacl.util.WebUtils;public class LoginServlet extends HttpServlet { public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, ioException {string username = request.getParameter ("username"); String password = request.getParameter ("password"); Userdao dao = Userdao baru (); Pengguna pengguna = dao.find (nama pengguna, kata sandi); if (user == null) {request.setAttribute ("pesan", "Nama pengguna atau kata sandi salah !!"); request.getRequestDispatcher ("/message.jsp"). Forward (Request, Response); kembali; } request.getSession (). setAttribute ("user", user); // Kirim cookie login otomatis ke browser klien untuk menyimpan SendAutologincookie (permintaan, respons, pengguna); request.getRequestDispatcher ("/index.jsp"). Forward (Request, Response); } / ** * @method: sendAutologincookie * @description: Kirim cookie login otomatis ke browser klien * @param permintaan * @param response * @param pengguna * / void private sendautologincookie (httpservletequest, httpservleteResponse response, httpservletequest, httpservleteSponse response, httpservletequest. LogInime = integer.parseint (request.getParameter ("LogIntime")); // Buat cookie, nama cookie adalah autologin, nilainya adalah nama pengguna dan kata sandi login pengguna, dan digunakan antara nama pengguna dan kata sandi. Itu terbagi. Kata sandi dienkripsi oleh MD5. Cookie = cookie baru ("autologin", user.getusername () + "." + Webutils.md5 (user.getPassword ())); // atur periode validitas cookie cookie.setmaxage (loginTime); // Atur jalur yang valid dari cookie cookie.setpath (request.getContextPath ()); // Tulis cookie ke response browser klien.addcookie (cookie); }} public void dopost (permintaan httpservletRequest, respons httpservletResponse) melempar servletException, ioException {doGet (permintaan, respons); }} Filter yang menangani login otomatis pengguna: autologinfilter
Paket me.gacl.web.filter; import java.io.ioException; impor javax.servlet.filter; import javax.servlet.filterchain; import javax.servlet.filterconfig; import javax.servlet.servletexception; impor javax.servlet. javax.servlet.servletresponse; import javax.servlet.http.cookie; impor javax.servlet.http.htpservletrequest; impor javax.servlet.http.httpservletResponse; impor me.gacl.dao.use.httpservletResponse; me.gacl.util.webutils; kelas publik autologinfilter mengimplementasikan filter {public void dofilter (servletRequest req, servletResponse resp, rantai filterchain) melempar ioException, servletException {httpservletRequest permintaan = (httpservletre) Respons httpservletResponse = (httpservletResponse) resp; // Jika Anda telah masuk, langsung rantai. kembali; } // 1. Dapatkan cookie dari authlogin yang dibawa oleh nilai string pengguna = null; Cookie cookie [] = request.getCookies (); untuk (int i = 0; cookies! = null && i <cookies.length; i ++) {if (cookies [i] .getName (). Equals ("AutoGin")) {value = cookies [i] .getValue (); }} // 2. Dapatkan nama pengguna dan kata sandi di cookie if (value! = Null) {string username = value.split ("//.") [0]; String password = value.split ("//.") [1]; // 3. Hubungi DAO untuk mendapatkan kata sandi yang sesuai dari pengguna pengguna DAO = USERDAO baru (); Pengguna pengguna = dao.find (nama pengguna); String dbpassword = user.getPassword (); // 4. Periksa apakah kata sandi MD5 yang dibawa oleh pengguna cocok dengan kata sandi dalam database. Jika cocok, itu akan secara otomatis masuk if (password.equals (webutils.md5 (dbpassword))) {request.getSession (). SetAttribute ("user", user); }} rantai.dofilter (permintaan, respons); } public void dashar () {} public void init (filterconfig filterconfig) melempar servletException {}} Jika Anda ingin membatalkan login otomatis, Anda dapat menghapus cookie login otomatis saat pengguna keluar. Kode inti adalah sebagai berikut:
Paket me.gacl.web.controller; import java.io.ioException; import javax.servlet.servletException; impor javax.servlet.http.cookie; import javax.servlet.htp.httpservlet; impor javax.servlet.http.htpsvet; javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;public class CancelAutoLoginServlet extends HttpServlet { public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { //Remove user request.getSession (). RemoveAttribute ("User"); // Lepaskan cookie yang secara otomatis masuk Removearologincookie (permintaan, respons); // hapus ke halaman login setelah logging out request.getRequestDispatcher ("/login.jsp"). Maju (permintaan, respons); } /** * @Method: removeAutoLoginCookie * @Description: Delete the automatic login cookie, * The way to delete the cookie in JavaWeb is to create a new cookie, the newly created cookie has the same name as the cookie to be deleted, * Set the validity period of the newly created cookie to 0, and the valid path is the same as the valid path of the cookie to be deleted* @param Permintaan * @param Response */Private void RemovearOlincookie (permintaan httpservletrequest, respons httpservletResponse) {// Buat cookie dengan nama autologin cookie cookie = cookie baru ("Autologin", "); atur periode validitas cookie ke 0 dan perintah Browser. cookie.setpath (request.getContextPath ());Di atas adalah beberapa skenario aplikasi yang umum dari filter, dan saya berharap mereka akan membantu pembelajaran semua orang.