# Gradle ## java com gradle Struts Funcionando ### Configuração gradle 6.4, java 8.0, postgre 15 ### Spring Security, Struts 2, Apache Tomcat 9.0.09 ```cmd= plugins { id 'java' id 'application' } group 'com.example' version '1.0-SNAPSHOT' repositories { mavenCentral() } dependencies { implementation 'org.springframework.boot:spring-boot-starter' testImplementation 'junit:junit:4.13.2' } application { mainClassName = 'com.example.Main' } ``` ### ./gradlew bootRun ### Java ```java= plugins { id 'org.springframework.boot' version '2.6.6' id 'io.spring.dependency-management' version '1.0.11.RELEASE' id 'java' id 'war' } group = 'com.example' version = '1.0-SNAPSHOT' sourceCompatibility = '11' repositories { mavenCentral() } dependencies { implementation 'org.springframework.boot:spring-boot-starter-web' implementation 'org.springframework.boot:spring-boot-starter-data-jdbc' implementation 'org.apache.struts:struts2-core:2.5.29' implementation 'org.apache.struts:struts2-spring-plugin:2.5.29' runtimeOnly 'mysql:mysql-connector-java' // Use o conector do seu banco de dados providedRuntime 'org.springframework.boot:spring-boot-starter-tomcat' testImplementation 'org.springframework.boot:spring-boot-starter-test' } tasks.named('test') { useJUnitPlatform() } ``` ### ServletContextInitializer ```java= package com.seuprojeto; import org.springframework.boot.web.servlet.ServletContextInitializer; import org.springframework.context.annotation.Configuration; import javax.servlet.ServletContext; import javax.servlet.ServletException; @Configuration public class WebAppInitializer implements ServletContextInitializer { @Override public void onStartup(ServletContext servletContext) throws ServletException { servletContext.setInitParameter("contextConfigLocation", "classpath:struts.xml"); servletContext.addListener(new org.apache.struts2.dispatcher.listener.StrutsListener()); servletContext.addFilter("struts2", new org.apache.struts2.dispatcher.filter.StrutsPrepareAndExecuteFilter()) .addMappingForUrlPatterns(null, false, "/*"); } } ``` ### ```cmd= plugins { id "org.springframework.boot.starter" } description = "Starter for building web, including RESTful, applications using Spring MVC. Uses Tomcat as the default embedded container" dependencies { api(project(":spring-boot-project:spring-boot-starters:spring-boot-starter")) api(project(":spring-boot-project:spring-boot-starters:spring-boot-starter-json")) api(project(":spring-boot-project:spring-boot-starters:spring-boot-starter-tomcat")) api("org.springframework:spring-web") api("org.springframework:spring-webmvc") } ``` ## struts.xml ```cmd= <!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.3//EN" "http://struts.apache.org/dtds/struts-2.3.dtd"> <struts> <package name="default" namespace="/" extends="struts-default"> <action name="login" class="com.example.action.LoginAction"> <result name="success">/WEB-INF/jsp/welcome.jsp</result> <result name="error">/WEB-INF/jsp/login.jsp</result> </action> <action name="register" class="com.example.action.RegisterAction"> <result name="success">/WEB-INF/jsp/login.jsp</result> <result name="error">/WEB-INF/jsp/register.jsp</result> </action> </package> </struts> ``` ## LoginAction ```cmd= package com.example.action; import com.opensymphony.xwork2.ActionSupport; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.jdbc.core.JdbcTemplate; import org.springframework.stereotype.Component; @Component public class LoginAction extends ActionSupport { private String username; private String password; @Autowired private JdbcTemplate jdbcTemplate; public String execute() { String sql = "SELECT COUNT(*) FROM users WHERE username = ? AND password = ?"; int count = jdbcTemplate.queryForObject(sql, new Object[]{username, password}, Integer.class); if (count > 0) { return SUCCESS; } else { addActionError("Invalid username or password"); return ERROR; } } // Getters and setters public String getUsername() { return username; } public void setUsername(String username) { this.username = username; } public String getPassword() { return password; } public void setPassword(String password) { this.password = password; } } ``` ## RegisterAction ```cmd= package com.example.action; import com.opensymphony.xwork2.ActionSupport; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.jdbc.core.JdbcTemplate; import org.springframework.stereotype.Component; @Component public class RegisterAction extends ActionSupport { private String username; private String password; @Autowired private JdbcTemplate jdbcTemplate; public String execute() { String sql = "INSERT INTO users (username, password) VALUES (?, ?)"; jdbcTemplate.update(sql, username, password); return SUCCESS; } // Getters and setters public String getUsername() { return username; } public void setUsername(String username) { this.username = username; } public String getPassword() { return password; } public void setPassword(String password) { this.password = password; } } ``` ### /webapp/WEB-INF/jsp/login.jsp ```cmd= /webapp/WEB-INF/jsp/login.jsp <%@ taglib uri="/struts-tags" prefix="s" %> <html> <head> <title>Login</title> </head> <body> <h2>Login</h2> <s:form action="login" method="post"> <s:textfield name="username" label="Username"/> <s:password name="password" label="Password"/> <s:submit value="Login"/> </s:form> <s:actionerror/> </body> </html> ``` ## register.jsp ```cmd= webapp/WEB-INF/jsp/register.jsp <%@ taglib uri="/struts-tags" prefix="s" %> <html> <head> <title>Register</title> </head> <body> <h2>Register</h2> <s:form action="register" method="post"> <s:textfield name="username" label="Username"/> <s:password name="password" label="Password"/> <s:submit value="Register"/> </s:form> <s:actionerror/> </body> </html> ``` ### Application ```java= package com.example; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; @SpringBootApplication public class Application { public static void main(String[] args) { SpringApplication.run(Application.class, args); } } ``` ## WebConfig ```cmd= package com.example.config; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.jdbc.core.JdbcTemplate; import org.springframework.jdbc.datasource.DriverManagerDataSource; import javax.sql.DataSource; @Configuration public class WebConfig { @Bean public DataSource dataSource() { DriverManagerDataSource dataSource = new DriverManagerDataSource(); dataSource.setDriverClassName("com.mysql.cj.jdbc.Driver"); dataSource.setUrl("jdbc:mysql://localhost:3306/seu_banco_de_dados"); dataSource.setUsername("seu_usuario"); dataSource.setPassword("sua_senha"); return dataSource; } @Bean public JdbcTemplate jdbcTemplate(DataSource dataSource) { return new JdbcTemplate(dataSource); } } ``` ## gradle clean build ## gradle bootRun ```cmd= src ├── main │ ├── java │ │ └── com │ │ └── example │ │ ├── action │ │ │ ├── LoginAction.java │ │ │ └── RegisterAction.java │ │ ├── config │ │ │ └── WebConfig.java │ │ └── Application.java │ ├── resources │ │ └── struts.xml │ └── webapp │ └── WEB-INF │ └── jsp │ ├── login.jsp │ └── register.jsp └── build.gradle ``` ```cmd= plugins { id 'org.springframework.boot' version '2.6.6' id 'io.spring.dependency-management' version '1.0.11.RELEASE' id 'java' id 'war' } group = 'com.example' version = '1.0-SNAPSHOT' sourceCompatibility = '11' repositories { mavenCentral() } dependencies { implementation 'org.springframework.boot:spring-boot-starter-web' implementation 'org.springframework.boot:spring-boot-starter-data-jdbc' implementation 'org.springframework.boot:spring-boot-starter-tomcat' implementation 'org.apache.struts:struts2-core:2.5.29' implementation 'org.apache.struts:struts2-spring-plugin:2.5.29' implementation 'javax.servlet:jstl' runtimeOnly 'mysql:mysql-connector-java' // Use o conector do seu banco de dados providedRuntime 'org.springframework.boot:spring-boot-starter-tomcat' testImplementation 'org.springframework.boot:spring-boot-starter-test' } tasks.named('test') { useJUnitPlatform() } ``` ## aplication.properties ```cmd= spring.datasource.url=jdbc:mysql://localhost:3306/seu_banco_de_dados spring.datasource.username=seu_usuario spring.datasource.password=sua_senha spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver ``` ## src/main/resources/struts.xml ```java= <!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.3//EN" "http://struts.apache.org/dtds/struts-2.3.dtd"> <struts> <package name="default" namespace="/" extends="struts-default"> <action name="login" class="com.example.action.LoginAction"> <result name="success">/WEB-INF/jsp/welcome.jsp</result> <result name="error">/WEB-INF/jsp/login.jsp</result> </action> <action name="register" class="com.example.action.RegisterAction"> <result name="success">/WEB-INF/jsp/login.jsp</result> <result name="error">/WEB-INF/jsp/register.jsp</result> </action> </package> </struts> ``` ## LoginAction ```cmd= package com.example.action; import com.opensymphony.xwork2.ActionSupport; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.jdbc.core.JdbcTemplate; import org.springframework.stereotype.Component; @Component public class LoginAction extends ActionSupport { private String username; private String password; @Autowired private JdbcTemplate jdbcTemplate; public String execute() { String sql = "SELECT COUNT(*) FROM users WHERE username = ? AND password = ?"; int count = jdbcTemplate.queryForObject(sql, new Object[]{username, password}, Integer.class); if (count > 0) { return SUCCESS; } else { addActionError("Invalid username or password"); return ERROR; } } // Getters and setters public String getUsername() { return username; } public void setUsername(String username) { this.username = username; } public String getPassword() { return password; } public void setPassword(String password) { this.password = password; } } ``` ### RegisterAction ```cmd= package com.example.action; import com.opensymphony.xwork2.ActionSupport; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.jdbc.core.JdbcTemplate; import org.springframework.stereotype.Component; @Component public class RegisterAction extends ActionSupport { private String username; private String password; @Autowired private JdbcTemplate jdbcTemplate; public String execute() { String sql = "INSERT INTO users (username, password) VALUES (?, ?)"; jdbcTemplate.update(sql, username, password); return SUCCESS; } // Getters and setters public String getUsername() { return username; } public void setUsername(String username) { this.username = username; } public String getPassword() { return password; } public void setPassword(String password) { this.password = password; } } ``` ### https://github.com/apache/struts-examples ### ```cmd= https://github.com/apache/struts-examples <?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"> <welcome-file-list> <welcome-file>index.jsp</welcome-file> </welcome-file-list> <filter> <filter-name>struts2</filter-name> <filter-class> org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter </filter-class> </filter> <listener> <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> </listener> <filter-mapping> <filter-name>struts2</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> </web-app> ``` ## https://struts.apache.org/getting-started/how-to-create-a-struts2-web-application ### mvn jetty:run ### Cedrtificated ```cmd= $ openssl s_client -connect repo.maven.apache.org:443 ``` ```cmd= MIIGazCCBVOgAwIBAgIQAXLAZBooKf1RECf2cHoYsTANBgkqhkiG9w0BAQsFADBY MQswCQYDVQQGEwJCRTEZMBcGA1UEChMQR2xvYmFsU2lnbiBudi1zYTEuMCwGA1UE AxMlR2xvYmFsU2lnbiBBdGxhcyBSMyBEViBUTFMgQ0EgMjAyMyBRNDAeFw0yMzEy MTcxNzUxMTRaFw0yNTAxMTcxNzUxMTNaMCAxHjAcBgNVBAMMFXJlcG8ubWF2ZW4u YXBhY2hlLm9yZzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBANPmLVYJ BGGMOeAuuZ07bhuezPK0BZM8ymGvPeQG6dtqMFX+jvGcEOElXFIf1EJlYT8OjUfg lhaocC3x4yOIAwpJOeKMTtKSp+hN+qrEU0gk9Suny8JmZ6gheTs+p+AomcQTWANX twEomanUoAaBEHDG/z8zNISygPgkchnZwWhTZ9X+2utXNfQTM51G0rnYu0igYIdZ 7LRcUoyGU1v2rfSjzJN+maHeXvHcuXCZulaxsw2NP0nHNu57IPNxvTr3edxpN6v+ 3QKxIE61gr0RqSrpS1mCkeqZBO23Wgz2+rC14efTNkFdVJodg4A8ffHtIbemo6RY Wd3Cdr7WoX3SYqkCAwEAAaOCA2cwggNjMCAGA1UdEQQZMBeCFXJlcG8ubWF2ZW4u YXBhY2hlLm9yZzAOBgNVHQ8BAf8EBAMCBaAwHQYDVR0lBBYwFAYIKwYBBQUHAwEG CCsGAQUFBwMCMB0GA1UdDgQWBBQ93URT65FichWIWGvbb0ze7R/3OjBXBgNVHSAE UDBOMAgGBmeBDAECATBCBgorBgEEAaAyCgEDMDQwMgYIKwYBBQUHAgEWJmh0dHBz Oi8vd3d3Lmdsb2JhbHNpZ24uY29tL3JlcG9zaXRvcnkvMAwGA1UdEwEB/wQCMAAw gZ4GCCsGAQUFBwEBBIGRMIGOMEAGCCsGAQUFBzABhjRodHRwOi8vb2NzcC5nbG9i YWxzaWduLmNvbS9jYS9nc2F0bGFzcjNkdnRsc2NhMjAyM3E0MEoGCCsGAQUFBzAC hj5odHRwOi8vc2VjdXJlLmdsb2JhbHNpZ24uY29tL2NhY2VydC9nc2F0bGFzcjNk dnRsc2NhMjAyM3E0LmNydDAfBgNVHSMEGDAWgBSqEXGPlcRYmIuxbg87UGgkvLgZ vDBIBgNVHR8EQTA/MD2gO6A5hjdodHRwOi8vY3JsLmdsb2JhbHNpZ24uY29tL2Nh L2dzYXRsYXNyM2R2dGxzY2EyMDIzcTQuY3JsMIIBfAYKKwYBBAHWeQIEAgSCAWwE ggFoAWYAdQBOdaMnXJoQwzhbbNTfP1LrHfDgjhuNacCx+mSxYpo53wAAAYx451Jd AAAEAwBGMEQCIBeejHrzGcl7Lrb5L8rhhOHlQni26PF1aEXfYZZvNFIaAiAj+WJH 9iQ/rPI57uHhkw/WwjxmnNY1GpAj2NGfH54k5AB2AD8XS0/XIkdYlB1lHIS+DRLt kDd/H4Vq68G/KIXs+GRuAAABjHjnUkMAAAQDAEcwRQIhANFI48P8IfmKY+LexiUL 7aV0UUCumQ4eQH0t3W4nnmSXAiBNdz0s6QmJHZiMVUbmBSxMGGhOgXAalRm1fkJ2 fuuuoAB1AM8RVu7VLnyv84db2Wkum+kacWdKsBfsrAHSW3fOzDsIAAABjHjnUvEA AAQDAEYwRAIgQlPixnbAxCpnRSKQwGV8x8+tzGinHCZK4C0ev3Y3mtYCIDsUGpNZ WNQloNm7+QPlwtM2uEvebTbG0iYbjh6bQ2cVMA0GCSqGSIb3DQEBCwUAA4IBAQCU rFNxKOcxSnxT1tRnETEdGTdSPV13FDH2kOA+14QMftTo0UuXohXTXTSBpFbD+Mir XzQJ9la1/nIFFoKJxqWd4pXNDy+aJMT+x1023gJX7nsXOls7o4NdoqYlRgjdO1/G ResQyq1CE0lnvbb+ZXqQrva23HJOM2V3/03EBWhdOr5Ph4jL7ALAuPxiiyrdKgtJ 28cYCdu/XDVutVC0QBCoqmcqTkFSr7Up+2iks65+uLZDOT8Rs6LcuQb6ZPX5mue5 47OVj7OKR84KKErsEK+XmNOGetRTsIg8N2BH0zWgXqxGU4a+IxFE48I7fCNxNCPB /1GMGmU7FoOXyZCK8DOw ``` ## SSSL ```cmd= New, TLSv1.2, Cipher is ECDHE-RSA-CHACHA20-POLY1305 Server public key is 2048 bit Secure Renegotiation IS supported Compression: NONE Expansion: NONE No ALPN negotiated SSL-Session: Protocol : TLSv1.2 Cipher : ECDHE-RSA-CHACHA20-POLY1305 Session-ID: F0EEA651074F23486A7E673D08BFC0F85AE1C5BBE562CA6C1F944F330D8D3171 Session-ID-ctx: Master-Key: E8E67AF435D37BD3F10024405871648D7CB2C2905D1790B095390E1D11F10661EA09D233F62DDF44420136B3E7FFF69D PSK identity: None PSK identity hint: None SRP username: None TLS session ticket lifetime hint: 7199 (seconds) TLS session ticket: 0000 - b3 9a 5b 04 b8 07 d3 43-67 6c cc 37 27 25 43 3d ..[....Cgl.7'%C= 0010 - f9 db 24 35 09 fe 3b 77-21 84 9b af 9f a4 b9 96 ..$5..;w!....... 0020 - 77 d5 2f a4 93 16 05 69-eb a4 77 8d 27 b3 97 99 w./....i..w.'... 0030 - 80 67 a2 5b 2e 15 39 40-9e f3 92 9f dd 12 6b d8 .g.[..9@......k. 0040 - b0 c8 c5 18 88 90 7d 21-34 6a c5 f6 b1 0c 8f 21 ......}!4j.....! 0050 - 92 9f e2 1c 9b de 96 6b-47 f4 4e 60 e8 2f e2 aa .......kG.N`./.. 0060 - a1 d2 cb 64 24 b1 5d af-76 e2 56 ce c1 2c 00 8f ...d$.].v.V..,.. 0070 - b1 73 7f af 6a 31 f6 8d-a3 e1 d1 6b 99 a6 fc 6a .s..j1.....k...j 0080 - 3a d5 21 70 bd 17 e7 78-d6 58 d9 21 18 d8 45 d2 :.!p...x.X.!..E. 0090 - a3 e9 26 c1 29 6b 45 12-d9 a3 0f 1f de 1f 6e 3f ..&.)kE.......n? 00a0 - 11 73 30 be ac cf 6b 1b-ab 05 f7 22 25 b8 b7 66 .s0...k...."%..f 00b0 - 90 58 15 c7 f0 5d d1 ae-97 f6 2e 3a f1 28 ce 01 .X...].....:.(.. Start Time: 1719205290 Timeout : 7200 (sec) Verify return code: 0 (ok) Extended master secret: yes --- ``` ### Openssl ```cmd= # Gerar uma chave privada openssl genrsa -out mykey.key 2048 # Criar um pedido de assinatura de certificado (CSR) openssl req -new -key mykey.key -out mycsr.csr # Gerar o certificado SSL autoassinado usando a chave privada e o CSR openssl x509 -req -days 365 -in mycsr.csr -signkey mykey.key -out mycert.crt ``` ## Comandos realizado OPENSSL ```cmd= openssl genrsa -out mykey.key 2048 # gerar certificado ### openssl req -new -key mykey.key -out myrequest.csr openssl req -new -key mykey.key -out myrequest.csr You are about to be asked to enter information that will be incorporated into your certificate request. What you are about to enter is what is called a Distinguished Name or a DN. There are quite a few fields but you can leave some blank For some fields there will be a default value, If you enter '.', the field will be left blank. ----- Country Name (2 letter code) [AU]:BR State or Province Name (full name) [Some-State]:RJ Locality Name (eg, city) []:RIO DE JANEIRO Organization Name (eg, company) [Internet Widgits Pty Ltd]:qintes Organizational Unit Name (eg, section) []:qintes Common Name (e.g. server FQDN or YOUR name) []:EdsonBelem Email Address []:profedsonbelem@gmail.com Please enter the following 'extra' attributes to be sent with your certificate request A challenge password []:122128Belem@ An optional company name []:Qintess ``` ## chave ssl ## decrypt file ## encrypt file ![image](https://hackmd.io/_uploads/B1y5QYU8R.png) ## decrypt file ![image](https://hackmd.io/_uploads/SkemQ4tLLA.png) ## openssl ![image](https://hackmd.io/_uploads/SkPySY8L0.png) ## Comandos de Criptografia ```cmd= openssl pkeyutl -decrypt -inkey mykey.key -in C:\Users\edson\encripted_file.txt -out decrypted_file.txt ``` ## backnode ### C:\Users\edson\projetofinal\backnode ## Gerar um arquivo auto assinado ### Arquivo gerado ```cmd= openssl x509 -req -days 365 -in myrequest.csr -signkey mykey.key -out mycert.crt ``` ## colocando a chave no java (ENTRAR NO MODO ADMINISTADOR CMD)... ```cmd= "%JAVA_HOME%\bin\keytool" -import -alias mycert -keystore "%JAVA_HOME%\lib\security\cacerts" -file "c:\users\edson\mycert.crt" -storepass changeit ``` ![image](https://hackmd.io/_uploads/rk6svtLI0.png) ### Resultado ```cmd= C:\Users\edson>"%JAVA_HOME%\bin\keytool" -import -alias mycert -keystore "%JAVA_HOME%\jre\lib\security\cacerts" -file "c:\users\edson\mycert.crt" -storepass changeit Owner: EMAILADDRESS=profedsonbelem@gmail.com, CN=EdsonBelem, OU=qintes, O=qintes, L=RIO DE JANEIRO, ST=RJ, C=BR Issuer: EMAILADDRESS=profedsonbelem@gmail.com, CN=EdsonBelem, OU=qintes, O=qintes, L=RIO DE JANEIRO, ST=RJ, C=BR Serial number: 23157e1cfbcb94abc5defc5bd0cfa1f97ffaa59c Valid from: Mon Jun 24 02:42:08 BRT 2024 until: Tue Jun 24 02:42:08 BRT 2025 Certificate fingerprints: SHA1: E3:65:C8:AF:E3:70:A5:3B:CA:AB:87:95:26:84:67:E2:90:AA:48:F1 SHA256: 2F:87:05:BB:A5:63:B5:A2:77:A8:7D:B1:D4:9B:42:96:D3:F9:52:34:B0:DE:4C:5F:4A:5A:EE:91:4A:E9:A9:9F Signature algorithm name: SHA256withRSA Subject Public Key Algorithm: 2048-bit RSA key Version: 3 Extensions: #1: ObjectId: 2.5.29.14 Criticality=false SubjectKeyIdentifier [ KeyIdentifier [ 0000: 46 C5 38 C3 33 CF DB B1 96 CF 1C 73 C5 BE 28 07 F.8.3......s..(. 0010: B0 91 FD 1A .... ] ] Trust this certificate? [no]: yes Certificate was added to keystore ``` #### Gradle ```cmd= C:\Users\edson\gradleproje>gradlew.bat build BUILD SUCCESSFUL in 15s 5 actionable tasks: 4 executed, 1 up-to-date C:\Users\edson\gradleproje> ``` ### JBOSSS PARAR ```cmd= sudo systemctl stop jboss.service sudo systemctl status jboss.service ``` ### Caminho Gradle C:\Users\edson\gradleproje C:\Users\edson\gradleproje\build\libs ## tomcat C:\Users\edson\programas\apache9 ```java= MeuAppStruts2/ ├── build.gradle ├── src/ │ ├── main/ │ │ ├── java/ │ │ │ └── br/ │ │ │ └── com/ │ │ │ └── copergas/ │ │ │ ├── action/ │ │ │ ├── dao/ │ │ │ └── entity/ │ │ ├── resources/ │ │ └── webapp/ │ │ ├── WEB-INF/ │ │ │ ├── web.xml │ │ │ └── struts.xml │ │ ├── index.jsp │ │ ├── welcome.jsp │ │ ├── login.jsp │ │ └── cadastro.jsp │ ├── test/ │ │ ├── java/ │ │ │ └── br/ │ │ │ └── com/ │ │ │ └── copergas/ │ │ │ └── dao/ │ │ └── resources/ └── ... ``` ### build.gradle ```java= plugins { id 'java' id 'war' id 'com.bmuschko.tomcat' version '2.7.0' } group = 'br.com.copergas' repositories { mavenCentral() jcenter() } dependencies { // Dependências do Struts2 implementation 'org.apache.struts:struts2-core:2.5.22' implementation 'org.apache.struts:struts2-convention-plugin:2.5.22' implementation 'org.apache.struts:struts2-json-plugin:2.5.22' // Dependências adicionais como JSP API e Servlet API se necessário implementation 'javax.servlet:javax.servlet-api:4.0.1' implementation 'javax.servlet.jsp:javax.servlet.jsp-api:2.3.3' implementation 'jstl:jstl:1.2' implementation 'org.springframework.security:spring-security-core:4.2.13.RELEASE' // Dependências de teste testImplementation 'junit:junit:4.13.2' // Tomcat tomcat "org.apache.tomcat.embed:tomcat-embed-core:9.0.65" tomcat "org.apache.tomcat.embed:tomcat-embed-logging-juli:9.0.65" tomcat "org.apache.tomcat.embed:tomcat-embed-jasper:9.0.65" } war { archiveBaseName = 'gradleproje' archiveVersion = '1.0.0' } sourceSets { main { java { srcDirs = ['src/main/java'] } resources { srcDirs = ['src/main/resources', 'src/main/webapp'] } } test { java { srcDirs = ['src/test/java'] } resources { srcDirs = ['src/test/resources'] } } } configurations.all { resolutionStrategy.cacheChangingModulesFor 0, 'seconds' resolutionStrategy.cacheDynamicVersionsFor 0, 'seconds' } tomcat { httpPort = 8085 contextPath = '/gradleproje' } ``` ### Comandos do gradle ```cmd= gradle wrapper --gradle-version 6.4 gradlew clean gradlew build --refresh-dependencies gradlew build --refresh-dependencies BUILD SUCCESSFUL in 3s 3 actionable tasks: 3 up-to-date C:\Users\edson\gradleproje> ``` ## Tomcat 9.5 ### C:\Users\edson\programas\apache9 ## localhost:8081 #### Tomcat 9.0.90 ![image](https://hackmd.io/_uploads/Hy2-NTL8A.png) ## Scoop Power Shell ```cmd= Set-ExecutionPolicy -ExecutionPolicy RemoteSigned -Scope CurrentUser Invoke-RestMethod -Uri https://get.scoop.sh | Invoke-Expression ``` ## Scoop **scoop bucket add versions scoop install versions/tomcat9** ```cmd= ## Atualizar o gradle gradlew clean build --refresh-dependencies gradlew clean build ## copiar parao tomcat copy build\libs\gradleproje-1.0.0.war C:\Users\edson\programas\apache9\webapps ## Abrir o Browser http://localhost:8086/gradleproje-1.0.0/ ``` ![image](https://hackmd.io/_uploads/ryp4maLLA.png) ```java= plugins { id 'java' id 'war' } group = 'br.com.copergas' repositories { mavenCentral() jcenter() } dependencies { // Dependências do Struts2 implementation 'org.apache.struts:struts2-core:2.5.22' implementation 'org.apache.struts:struts2-convention-plugin:2.5.22' implementation 'org.apache.struts:struts2-json-plugin:2.5.22' // Dependências adicionais como JSP API e Servlet API se necessário implementation 'javax.servlet:javax.servlet-api:4.0.1' implementation 'javax.servlet.jsp:javax.servlet.jsp-api:2.3.3' implementation 'jstl:jstl:1.2' implementation 'org.springframework.security:spring-security-core:4.2.13.RELEASE' // Dependências de teste testImplementation 'junit:junit:4.13.2' } war { archiveBaseName = 'gradleproje' archiveVersion = '1.0.0' } sourceSets { main { java { srcDirs = ['src/main/java'] } resources { srcDirs = ['src/main/resources', 'src/main/webapp'] } } test { java { srcDirs = ['src/test/java'] } resources { srcDirs = ['src/test/resources'] } } } configurations.all { resolutionStrategy.cacheChangingModulesFor 0, 'seconds' resolutionStrategy.cacheDynamicVersionsFor 0, 'seconds' } ``` ## cadastro.jsp ```cmd= <%@ taglib prefix="s" uri="/struts-tags" %> <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <!DOCTYPE html> <html> <head> <title>Cadastro de Usuários</title> </head> <body> <h2>Cadastro de Usuários</h2> <s:form action="register"> <s:textfield name="user.name" label="Nome" required="true"/> <s:textfield name="user.email" label="Email" required="true"/> <s:password name="user.password" label="Senha" required="true"/> <s:textfield name="user.token" label="Token" required="true"/> <s:submit value="Registrar"/> </s:form> </body> </html> ``` ### HelloAction.java ```java= package br.com.copergas.action; import com.opensymphony.xwork2.ActionSupport; public class HelloAction extends ActionSupport{ private String message; public String execute() { setMessage("Hello, Struts2!"); return SUCCESS; } public String getMessage() { return message; } public void setMessage(String message) { this.message = message; } } ``` ## UsersAction.java ```java= package br.com.copergas.action; import java.util.List; import com.opensymphony.xwork2.ActionSupport; import br.com.copergas.dao.UsersDao; import br.com.copergas.entity.Users; import br.com.copergas.service.UsersServiceToken; public class UsersAction extends ActionSupport { private UsersDao userDao = new UsersDao(); private Users user; private List<Users> users; private UsersServiceToken tokenService = new UsersServiceToken(); private String token; public String login() { Users authenticatedUser = getUserDao().getUserByEmailAndPassword(getUser().getEmail(), getUser().getPassword()); if (authenticatedUser != null) { setUser(authenticatedUser); setToken((String) getTokenService().getGenerateTokenWithEmail(getUser().getEmail())); return SUCCESS; } return ERROR; } public String list() { setUsers(getUserDao().getAllUsers()); return SUCCESS; } public Users getUser() { return user; } public void setUser(Users user) { this.user = user; } public List<Users> getUsers() { return users; } public void setUsers(List<Users> users) { this.users = users; } public String register() { try { getUserDao().saveUser(getUser()); return SUCCESS; } catch (Exception e) { addActionError("An error occurred during registration: " + e.getMessage()); return ERROR; } } public UsersDao getUserDao() { return userDao; } public void setUserDao(UsersDao userDao) { this.userDao = userDao; } public UsersServiceToken getTokenService() { return tokenService; } public void setTokenService(UsersServiceToken tokenService) { this.tokenService = tokenService; } public String getToken() { return token; } public void setToken(String token) { this.token = token; } } ``` ## AbstractDao ```java= package br.com.copergas.dao; import java.sql.Connection; import java.sql.DriverManager; import java.sql.SQLException; public abstract class AbstractDao { private final String url = "jdbc:postgresql://localhost:5432/copergas"; private final String user = "postgres"; private final String password = "root1"; static { try { Class.forName("org.postgresql.Driver"); } catch (ClassNotFoundException e) { System.out.println("PostgreSQL JDBC Driver not found. Include it in your library path."); e.printStackTrace(); } } protected Connection getConnection() throws Exception { return DriverManager.getConnection(url, user, password); } protected void closeConnection(Connection conn) { if (conn != null) { try { conn.close(); } catch (SQLException e) { System.out.println("Failed to close connection: " + e.getMessage()); } } } } ``` UsersDao.java ```java= package br.com.copergas.dao; import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; import java.util.ArrayList; import java.util.List; import br.com.copergas.entity.Users; import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder; public class UsersDao extends AbstractDao { private final BCryptPasswordEncoder encoder = new BCryptPasswordEncoder(); public Users getUserByEmailAndPassword(String email, String password) { String sql = "SELECT id, name, email, password, token FROM users WHERE email = ?"; Connection conn = null; try { conn = getConnection(); PreparedStatement pstmt = conn.prepareStatement(sql); pstmt.setString(1, email); ResultSet rs = pstmt.executeQuery(); if (rs.next()) { Users user = extractUserFromResultSet(rs); if (encoder.matches(password, user.getPassword())) { return user; } } } catch (SQLException e) { System.out.println("Query failed: " + e.getMessage()); } catch (Exception ex) { System.out.println("Error: " + ex.getMessage()); } finally { closeConnection(conn); } return null; } public void saveUser(Users user) { String sql = "INSERT INTO users(name, email, password, token, status) VALUES(?,?,?,?,?)"; Connection conn = null; try { conn = getConnection(); PreparedStatement pstmt = conn.prepareStatement(sql); pstmt.setString(1, user.getName()); pstmt.setString(2, user.getEmail()); String hashedPassword = encoder.encode(user.getPassword()); pstmt.setString(3, hashedPassword); pstmt.setString(4, ""); pstmt.setString(5, "ACTIVE"); pstmt.executeUpdate(); } catch (SQLException e) { System.out.println("Insert failed: " + e.getMessage()); } catch (Exception ex) { System.out.println("Error: " + ex.getMessage()); } finally { closeConnection(conn); } } private Users extractUserFromResultSet(ResultSet rs) throws Exception { Users user = new Users(); user.setId(rs.getInt("id")); user.setName(rs.getString("name")); user.setEmail(rs.getString("email")); user.setPassword(rs.getString("password")); user.setToken(rs.getString("token")); user.setStatus(rs.getString("status")); return user; } public List<Users> getAllUsers() { List<Users> users = new ArrayList<>(); String sql = "SELECT * FROM users"; Connection conn = null; try { conn = getConnection(); PreparedStatement stmt = conn.prepareStatement(sql); ResultSet rs = stmt.executeQuery(sql); while (rs.next()) { users.add(extractUserFromResultSet(rs)); } } catch (SQLException e) { System.out.println("Query failed: " + e.getMessage()); } catch (Exception ex) { System.out.println("Error: " + ex.getMessage()); } return users; } public void updateUser(Users user) { String sql = "UPDATE users SET name = ?, email = ?, password = ?, token = ? , status =? WHERE id = ?"; Connection conn = null; try { conn = getConnection(); PreparedStatement pstmt = conn.prepareStatement(sql); pstmt.setString(1, user.getName()); pstmt.setString(2, user.getEmail()); pstmt.setString(3, user.getPassword()); pstmt.setString(4, user.getToken()); pstmt.setString(5, user.getStatus()); pstmt.setInt(6, user.getId()); pstmt.executeUpdate(); } catch (SQLException e) { System.out.println("Update failed: " + e.getMessage()); } catch (Exception ex) { System.out.println("Error: " + ex.getMessage()); } } public void deleteUser(int id) { String sql = "DELETE FROM users WHERE id = ?"; Connection conn = null; try { conn = getConnection(); PreparedStatement pstmt = conn.prepareStatement(sql); pstmt.setInt(1, id); pstmt.executeUpdate(); } catch (SQLException e) { System.out.println("Delete failed: " + e.getMessage()); } catch (Exception ex) { System.out.println("Error: " + ex.getMessage()); } } public Users getUserById(int userId) { String sql = "SELECT id, name, email, password, token, status FROM users WHERE id = ?"; Connection conn = null; try { conn = getConnection(); PreparedStatement pstmt = conn.prepareStatement(sql); pstmt.setInt(1, userId); ResultSet rs = pstmt.executeQuery(); if (rs.next()) { return extractUserFromResultSet(rs); } } catch (SQLException e) { System.out.println("Query failed: " + e.getMessage()); } catch (Exception ex) { System.out.println("Error: " + ex.getMessage()); } finally { closeConnection(conn); } return null; } } ``` ## struts.xml ```xml= <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.5//EN" "http://struts.apache.org/dtds/struts-2.5.dtd"> <struts> <package name="default" namespace="/" extends="struts-default"> <action name="login" class="br.com.copergas.action.UsersAction" method="login"> <result name="success">/welcome.jsp</result> <result name="error">/login.jsp</result> <result name="input">/login.jsp</result> </action> <action name="register" class="br.com.copergas.action.UsersAction" method="register"> <result name="success">/welcome.jsp</result> <result name="error">/error.jsp</result> </action> <action name="list" class="br.com.copergas.action.UsersAction" method="list"> <result name="success">/listagem.jsp</result> </action> <action name="hello" class="br.com.copergas.action.HelloAction"> <result>/hello.jsp</result> </action> </package> </struts> ``` ### web.xml ```java= <?xml version="1.0" encoding="UTF-8"?> <web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd" version="4.0"> <display-name>Struts 2 Web Application</display-name> <filter> <filter-name>struts2</filter-name> <filter-class>org.apache.struts2.dispatcher.filter.StrutsPrepareAndExecuteFilter</filter-class> </filter> <filter-mapping> <filter-name>struts2</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> <welcome-file-list> <welcome-file>index.jsp</welcome-file> </welcome-file-list> </web-app> ``` ## cadastro.jsp ```java= <%@ taglib prefix="s" uri="/struts-tags" %> <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <!DOCTYPE html> <html> <head> <title>Cadastro de Usuários</title> </head> <body> <h2>Cadastro de Usuários</h2> <s:form action="register"> <s:textfield name="user.name" label="Nome" required="true"/> <s:textfield name="user.email" label="Email" required="true"/> <s:password name="user.password" label="Senha" required="true"/> <s:submit value="Registrar"/> </s:form> </body> </html> ``` ## login.jsp ```java= <%@ taglib prefix="s" uri="/struts-tags" %> <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <!DOCTYPE html> <html> <head> <title>Login de Users</title> </head> <body> <h2>Login de Users</h2> <s:form action="login"> <s:textfield name="user.email" label="Email" required="true"/> <s:password name="user.password" label="Senha" required="true"/> <s:submit value="Login"/> </s:form> <s:if test="token != null"> <p>Login successful! Your token is: <s:property value="token"/></p> </s:if> <s:if test="hasActionErrors()"> <s:actionerror/> </s:if> </body> </html> ``` ### build.gradle ### Spring Security com Struts2 ```java= plugins { id 'java' id 'war' } group = 'br.com.copergas' repositories { mavenCentral() jcenter() } dependencies { // Dependências do Struts2 implementation 'org.apache.struts:struts2-core:2.5.22' implementation 'org.apache.struts:struts2-convention-plugin:2.5.22' implementation 'org.apache.struts:struts2-json-plugin:2.5.22' // Dependências adicionais como JSP API e Servlet API se necessário implementation 'javax.servlet:javax.servlet-api:4.0.1' implementation 'javax.servlet.jsp:javax.servlet.jsp-api:2.3.3' implementation 'jstl:jstl:1.2' implementation 'org.springframework.security:spring-security-core:4.2.13.RELEASE' implementation 'org.postgresql:postgresql:42.2.20' implementation 'io.jsonwebtoken:jjwt-api:0.11.2' implementation 'io.jsonwebtoken:jjwt-impl:0.11.2' implementation 'io.jsonwebtoken:jjwt-jackson:0.11.2' // Dependências de teste testImplementation 'junit:junit:4.13.2' } war { archiveBaseName = 'gradleproje' archiveVersion = '1.0.0' } sourceSets { main { java { srcDirs = ['src/main/java'] } resources { srcDirs = ['src/main/resources', 'src/main/webapp'] } } test { java { srcDirs = ['src/test/java'] } resources { srcDirs = ['src/test/resources'] } } } configurations.all { resolutionStrategy.cacheChangingModulesFor 0, 'seconds' resolutionStrategy.cacheDynamicVersionsFor 0, 'seconds' } ``` ![image](https://hackmd.io/_uploads/SJp_5CLUC.png) ```cmd= ## Atualizar o gradle gradlew clean build --refresh-dependencies gradlew clean build ## copiar parao tomcat copy build\libs\gradleproje-1.0.0.war C:\Users\edson\programas\apache9\webapps ## Abrir o Browser http://localhost:8086/gradleproje-1.0.0/ ``` ![image](https://hackmd.io/_uploads/B1_ViAUU0.png) ![image](https://hackmd.io/_uploads/HyIds0UIC.png) ![image](https://hackmd.io/_uploads/rk8osALUC.png) ## Struts2 Funcionando com Spring Security